惑!!!memset初始化字符串 0 0x00 的区别

Z___P 2011-06-15 09:52:05
char str[100];

memset(str,0x00,sizeof(str)); /*16进制的0*/

memset(str,0,sizeof(str)); /*10进制的0*/

看老鸟们很多都写16进制的。

但我是用10进制的也没有发现什么问题啊?

请各位高人指教!

谢谢!
...全文
2287 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2013-04-22
  • 打赏
  • 举报
回复
引用 7 楼 aozhi 的回复:
0x00在常量区里占1个字节, 0在常量区里占sizeof(int)个字节。 虽说memset(str,0,sizeof(str)); 时,会只保留0的低8位,结果一样。 但用0x00确实是一个好习惯,它体现了一个程序员对于移植性的意识。
你 sizeof(0x00) 看看到底几个字节,况且 memset 第二个参数就是 int 类型。
tanking1105 2012-12-28
  • 打赏
  • 举报
回复
加一个取地址符 有什么不同吗?
引用 11 楼 hzy694358 的回复:
我擦,楼主怎么测试的,什么操作系统,什么编译工具 还有 memset(c,0,sizeof(c));应该是 memset(&c,0,sizeof(c));吧
G_Spider 2011-06-15
  • 打赏
  • 举报
回复
memset中间的参数虽然是4字节,但只有低8位有效。
wangsifu2009 2011-06-15
  • 打赏
  • 举报
回复
hoho~~
小小蔷薇 2011-06-15
  • 打赏
  • 举报
回复
memset是按一个字节的大小来初始化的,就是第三个参数的大小都是x*sizeof(char)
你要定义int a[25]; int大小4
memset(a,0,100);
赵4老师 2011-06-15
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)
Z___P 2011-06-15
  • 打赏
  • 举报
回复
晕,写错了。
错了 5555555555555555555555555555555555555555555




的确是0,想错 了


我以为我创建一个24位的内存

用16位初始化的时候后8位不能影响到

只有在使用8为进行初始化的时候才能 8*3 = 24 位

。。。。。。。。。。。。丢人了。
hzy694358 2011-06-15
  • 打赏
  • 举报
回复
我擦,楼主怎么测试的,什么操作系统,什么编译工具
还有 memset(c,0,sizeof(c));应该是
memset(&c,0,sizeof(c));吧
liuhex 2011-06-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 z___p 的回复:]
我刚刚做了一个实验
环境:AIX 6.1 , CC
代码如下:

C/C++ code

+1 #include <stdio.h>
+2
+3 int main(){
+4 struct test{
+5 int a;
+6 char ……
[/Quote]

怎么会输出a呢?我测试的输出结果都是0

int main(){
struct test{
int a;
char b;
};

struct test c;
c.a = 1;
c.b = 'a';
memset(&c,0x00,sizeof(c));
/* memset(&c,0,sizeof(c));;*/

printf("%c,%d\n",c.b,c.a);
system("pause");

}
Z___P 2011-06-15
  • 打赏
  • 举报
回复
我刚刚做了一个实验
环境:AIX 6.1 , CC
代码如下:

+1 #include <stdio.h>
+2
+3 int main(){
+4 struct test{
+5 int a;
+6 char b;
+7 };
+8
+9 struct test c;
+10 c.a = 1;
+11 c.b = 'a';
+12
+13 /* memset(c,0x00,sizeof(c));*/
+14 memset(c,0,sizeof(c));
+15
+16 printf("%c\n",c.b);
+17
+18
+19
+20 }

我惊讶的发现居然有输出 a

原来如此,明白了!

感谢大家的积极参与和热烈讨论,尤其感谢7楼的提醒!
ckc 2011-06-15
  • 打赏
  • 举报
回复
7楼的说法不知道是自己想出来的还是有什么依据
比如我写1+1+1+1-4,那在常量区要占几个字节啊
aozhi 2011-06-15
  • 打赏
  • 举报
回复
0x00在常量区里占1个字节,
0在常量区里占sizeof(int)个字节。
虽说memset(str,0,sizeof(str)); 时,会只保留0的低8位,结果一样。
但用0x00确实是一个好习惯,它体现了一个程序员对于移植性的意识。
恨天低 2011-06-15
  • 打赏
  • 举报
回复
没区别。
luciferisnotsatan 2011-06-15
  • 打赏
  • 举报
回复
没区别,都是0
0x00是16进制写法
bdmh 2011-06-15
  • 打赏
  • 举报
回复
不都一样吗,都是0
机智的呆呆 2011-06-15
  • 打赏
  • 举报
回复
木有区别
Uncle_higo 2011-06-15
  • 打赏
  • 举报
回复
一样一样一样的啊
ryfdizuo 2011-06-15
  • 打赏
  • 举报
回复
恩,0都是一样的。
16进制清楚一点0x00一共八位、
如此美丽的你 2011-06-15
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zhao4zhong1 的回复:]

VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)
[/Quote]
en!!!!!!!!!!

70,027

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧