memset函数用法及注意事项
头文件
#include<cstring>//
or
#include<memory.h>
------------------------------------------
在memset使用时要千万小心,在给char 以外 的数组赋值时,
只能初始化为0或者-1。 (看最后的0和1的补码)
/////////// 给bool类型数组可以初始化1
------------------------------------------
头文件#include<cstring>
int arr[100];
memset(arr,0,sizeof(int)*100);
arr是数组的首地址,0就是要将这些地址的内容赋值为0,sizeof(int)求出int类型的长度,
乘以100就表示arr数组的整个长度。
也可以这样 ------
memset(arr,0,sizeof(arr));
------------------------------------------
memset函数用法及注意事项memset 函数是内存赋值函数,用来给某一块内存空间进行赋值的。
其原型是:void* memset(void *_Dst, int _Val, size_t _Size);
使用时在文件头加上#include "stdlib.h" 。
_Dst是目标起始地址,_Val是要赋的值,_Size是要赋值的字节数 。
例1:
char str[9];
我们用memset给str初始化为“00000000”,用法如下
memset(str,0,8);
注意,memset是逐字节 拷贝的。
下面再看一个例子:
例2:
int num[8];
我们用memset给str初始化为{1,1,1,1,1,1,1,1},
memset(num,1,8);//这样是不对的
一个int是4个字节的,8个int是32个字节,所以首先要赋值的长度就不应该为8而是32。
因为memset是 逐字节 拷贝,以num为首地址的8字节空间都被赋值为1,
即一个int变为0X00000001 00000001 00000001 00000001,
显然,把这个数化为十进制不会等于1的。
所以,在memset使用时要千万小心,在给char以外的数组赋值时,
只能初始化为0或者-1。 (看最后的0和-1的补码)
因为在计算机里,0的二进制都是0,-1的二进制都是1。
最近才发现memset的这个问题,之所以要写这篇文章,是因为我在自己的DES算法里多处用到了memset,而我当时却不知memset有这个问题,特此记下,引以为鉴。
---------------------
例如:
#include "stdio.h"
#include <string.h>
int main()
{
char s[100]="Golden Global View";
memset(s,'G',6);
printf("%s",s);
getchar();
return 0;
}
结果
----------
GGGGGG Global View
----------
----------------------------------------------------------------------
补码+0和-0相同?
我知道+0和-0补码相同,可是比如在八位机上,
+0(00000000)求补码是10000000,
而-0(10000000)求补码是(00000000)啊,
求补码的做法是符号位不变,其余为取反,然后再加1,
没错吧,那我的错误出在哪里?
----------
提问者采纳
就没有正确的地方,在计算机中是不存在正负零之分的.
而你对补码理解又有错误的.补码只不过是用来表示带符号数而已.
补码的原则是:
正数的补码是其本身,也就是原码.
负数的补码是各位取反后加1.也就是其反码加1.
+0的补码就是其原码,也就是说是0000 0000而已(对于8位来说)
-0的补码是其反码加1,其反码是1111 1111,
当然,其反码加1后就是溢出一个进位后,仍然是0000 0000.
----------------------------------------------------------------------
--------------------------------------------------------------------------------
请问-1的二进制如何表示?
不知道是1000000000000001 还是1111111111111111
我觉得是第一个,首位代表符号,0代表正、1代表负,剩下的代表实际数值,
为什么在C语言里第二个是-1呢
--------------------
提问者采纳
第一个是原码的话,
表示的也是-1第二个是补码表示的-1,
补码即原码除符号位外,全部取反+1
1000000000000001取反后是1111111111111110,再+1即1111111111111111
C里面数是以补码方式来储存的
--------------------------------------------------------------------------------
memset函数用法及注意事项的更多相关文章
- memset函数用法
1. memset()函数原型是extern void *memset(void *buffer, int c, int count) buffer:为指针或是数组 c:是赋给buffer的值 cou ...
- memset()函数用法及其作用
memset()函数原型是: extern void *memset(void *buffer, int c, int count) //buffer:为指针或是数组, //c:是赋给buffer的值 ...
- C++ memset函数用法
#include<stdio.h>#include<string.h>int main(){ char buffer[] = "I love you!"; ...
- C语言 memset函数及其用法
定义 void *memset(void *s, int c, unsigned long n); 描述 将指针变量 s 所指向的前 n 字节的内存单元用一个“整数” c 替换,注意 c 是 int ...
- memset函数及注意事项
memset函数的原型为:void * memset(void *ptr,int value,size_t num);用于为地址ptr开始的num个字节赋值value. memset函数的头文件为:C ...
- memset函数及其用法,C语言memset函数详解
在前面不止一次说过,定义变量时一定要进行初始化,尤其是数组和结构体这种占用内存大的数据结构.在使用数组的时候经常因为没有初始化而产生“烫烫烫烫烫烫”这样的野值,俗称“乱码”. 每种类型的变量都有各自的 ...
- cpp中memset函数的注意点
可参考: C++中memset函数的用法 C++中memset函数的用法 C++中memset()函数的用法详解 c/c++学习系列之memset()函数 透彻分析C/C++中memset函数 mem ...
- C++之memset函数
可参考: C++中memset函数的用法 C++中memset函数的用法 C++中memset()函数的用法详解 c/c++学习系列之memset()函数 透彻分析C/C++中memset函数 mem ...
- memset函数详解
语言中memset函数详解(2011-11-16 21:11:02)转载▼标签: 杂谈 分类: 工具相关 功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大 ...
随机推荐
- Linux下Ngnix及PHP重启命令
INT, TERM 立刻终止 QUIT 平滑终止 USR1 重新打开日志文件 USR2 平滑重载所有worker进程并重新载入配置和二进制模块 php-fpm 关闭: kill -INT `cat / ...
- Linux考试题附答案
一.选择题 1.在登录Linux时,一个具有唯一进程ID号的shell将被调用,这个ID是什么(B)? A.NID B.PID C.UID D.CID 2.下面哪个目录存放用户密码信息(B) A./b ...
- python Flask框架CBV视图
1.演示之前需要先写一个装饰器 # 装饰器 def wrapper(func): def inner(*args, **kwargs): print('操作函数%s之前' % func.__name_ ...
- Apache JServ Protocol (AJP)
The Apache JServ Protocol (AJP) is a binary protocol that can proxy inbound requests from a web serv ...
- C#编写图书列表winform
Book.cs文件 using System; using System.Collections.Generic; using System.Linq; using System.Text; usin ...
- 2015.6.30 反弹的教训(想做T)
心路:在6.29号,市场连续大跌!我到6.29号才想到可以做T+0.6.30消息面已经利好(双降准),已经计划做T+0(X先买后卖). 开市大跌至跌停.午后所有股票开始反弹.但是上午跌停时不敢入市, ...
- Centos7.2安装bacula及bacula-web
serverd端安装(centos7) bacula的安装很简单,但是配置文件内容很多,配置不正确服务就启动不了,所以需要用webmin来配置. 1.安装基础软件包: 关闭SElinux(重要)set ...
- selection createTextRange setSelectionRange
http://www.cnblogs.com/rainman/archive/2011/02/27/1966482.html http://www.zhangxinxu.com/wordpress/2 ...
- [转] 我所经历的IBM SOA与系统整合
2006年,一汽大众新上来一位总经理,新加坡人,整个一国际背景高端管理人才,是德国人和中国人博弈后取得的胜利. 一汽大众过去是从总部到区域到终端一体化的大盘管理模式,很僵化很粘稠,不利用快速反应.于是 ...
- jQuery中的部分方法
1.empty() – jQuery 文档操作 从被选元素移除所有内容,包括所有文本和子节点. 用法:$(selector).empty(); 其中,selector可以是"#id" ...