memset的问题

lswx 2005-03-17 10:34:43
memset(a, 0, sizeof(a));

memset(a, 0x00, sizeof(a));
有什么区别?
对于一个字符串a,memset(a, 0, sizeof(a));字符串里面的东西被清空了没有?

我做了很错次实验是在发现不了有什么不同?
但是我的一个程序出了问题:
问题如下:
char a[60]= "chinacsdnchinacsdnchinacsdn";
char b[30];
//我要做的就是删除a的前9位,把剩余的部分提前到数组初始位置
从a的第10位开始复制
strncpy(b, &a[9], strlen(&a[9]));
memset(a, 0, sizeof(a));
strncpy(a, b,strlen9(b));
打印a,b中的内容,b正常,但是a末尾出现了很多字符,如果是乱码什么的都可以接受,但是出现的字符就是a中的一段字符。

请问各位高手告诉我为什么?

还有结构体可以用memset这样初始吗?


...全文
234 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
lswx 2005-03-21
  • 打赏
  • 举报
回复
呵呵 谢谢楼上各位。我在HP-Unix下按照原来的又试了次,问题没有再现。或许我当时记错了,还是编译器行为问题,那个问题就出现了一次。
xjp6688 2005-03-20
  • 打赏
  • 举报
回复
结果:

Buffer before memset: Hello world

Buffer after memset: ***********
xjp6688 2005-03-20
  • 打赏
  • 举报
回复
#include <string.h>
#include <stdio.h>
#include <mem.h>

int main(void)
{
char buffer[] = "Hello world\n";

printf("Buffer before memset: %s\n", buffer);
memset(buffer, '*', strlen(buffer) - 1);
printf("Buffer after memset: %s\n", buffer);
return 0;
}
Flood1984 2005-03-20
  • 打赏
  • 举报
回复
strncpy(b, &a[9], strlen(&a[9]));//这一句并不因为b[30]而只拷贝30个字符,他将a的剩余部分全部拷贝到了从b[0]开始的地址中,所以后来又被复制到了a中,所以打印时会是a的字符。
memset(a, 0, sizeof(a));
strncpy(a, b,strlen9(b));
lswx 2005-03-17
  • 打赏
  • 举报
回复
这个问题没有再现了!这就是我郁闷的原因!我按哪种思路都理解不了
zhangfjj 2005-03-17
  • 打赏
  • 举报
回复
char a[100]= "testtesttest";
char b[10] = "nihao";
memset(a, 0, sizeof(a));
//也就是说我初始化为'\0'了
strncpy(a, b, strlen(b));
printf打印a,按道理说a就该出现nihao,因为随后就是一个‘\0',但是奇怪的是他后面出现了乱码

==============
不过,我在dev-c++中,turbo c 中,都是正常的
#include <stdio.h>
#include <string.h>
int main()
{
char a[100]= "testtesttest";
char b[10] = "nihao";
memset(a, 0, sizeof(a));
strncpy(a, b, strlen(b));
printf("a=%s,b=%s\n",a,b);
return 0;
}
这样吧,你最好再新建一个文件,对程序重新编译,再试试!
可惜,hp-unix我没有!不然也来试试!
lswx 2005-03-17
  • 打赏
  • 举报
回复
恩 我实验了一下,楼上说的对.

但是我有个问题非常不理解,我在HP-UNIX下
char a[100]= "testtesttest";
char b[10] = "nihao";
memset(a, 0, sizeof(a));
//也就是说我初始化为'\0'了
strncpy(a, b, strlen(b));
printf打印a,按道理说a就该出现nihao,因为随后就是一个‘\0',但是奇怪的是他后面出现了乱码
zhangfjj 2005-03-17
  • 打赏
  • 举报
回复
0
'\0'是一样的,书上不是说,字符数据以其ascii值存储吗,所以'\0'就是0
但' '是空格吧,它对应的ascii码值是32?
空格怎么会和0,'\0'一样呢?
lswx 2005-03-17
  • 打赏
  • 举报
回复
0 和 ‘\0' 还有' '一样?
memset(a, 0, sizeof(a));
memset(a, ‘\0', sizeof(a));
memset(a, ' ', sizeof(a));
效果一样?

zhangfjj 2005-03-17
  • 打赏
  • 举报
回复
也有可能在找到\0之前内存中都是空白,
====
空白不就是'\0'吗?
zhangfjj 2005-03-17
  • 打赏
  • 举报
回复
因为memset(a,0,sizeof(a));把数组置0了,第一个a[0]就等于'\0'也就是0,
lswx 2005-03-17
  • 打赏
  • 举报
回复
是不是说在告诉printf函数要打印的首地址后,他打印到出现\0的地方为止,当然大多数会在找\0过程中输出乱码,也有可能在找到\0之前内存中都是空白,所以打印都是空白?
lswx 2005-03-17
  • 打赏
  • 举报
回复
谢谢楼上的回答,那么请问
char a[20];并不赋值,
打印a的内容当然里面会出现乱码
memset(a, 0, sizeof(a));
打印a的内容为什么没有出现乱码?以我的理解他没有\0,他也该处乱码阿?
zhangfjj 2005-03-17
  • 打赏
  • 举报
回复
最后,对结构体当然可以,反正它是按字节进行复制。
zhangfjj 2005-03-17
  • 打赏
  • 举报
回复
void memset(void *buf,int ch,size_t count)是将ch的低字节复制到buf指向的数组的前count字节处,并返回buf.
所以memset(a, 0, sizeof(a));

memset(a, 0x00, sizeof(a));
两者是没有区别的!


#include <stdio.h>
#include <string.h>


int main()
{
char a[60]= "chinacsdnchinacsdnchinacsdn";
char b[30];
//我要做的就是删除a的前9位,把剩余的部分提前到数组初始位置,从a的第10位开始复制
strncpy(b, &a[9], strlen(&a[9]));
//a="chinacsdnchinacsdnchinacsdn"
//b="chinacsdnchinacsdn" ,注意,使用strncpy进行复制时,按
//你的写法,只复制后面18个字符,有效字符,不包括'\0' ,这样就引起了问题
memset(a, 0, sizeof(a));
strncpy(a, b,strlen(b));
printf("a=%s\n",a);
printf("b=%s\n",b);
system("pause");
return 0;
}

事实上你改用strcpy(),此时它会加上'\0'
#include <stdio.h>
#include <string.h>


int main()
{
char a[60]= "chinacsdnchinacsdnchinacsdn";
char b[30];
printf("a=%s\n\n",a);

//我要做的就是删除a的前9位,把剩余的部分提前到数组初始位置,从a的第10位开始复制
//strncpy(b, &a[9], strlen(&a[9]));
strcpy(b,&a[9]);
//a="chinacsdnchinacsdnchinacsdn"
//b="chinacsdnchinacsdn" ,注意,使用strncpy进行复制时,按
//你的写法,只复制后面18个字符,有效字符,不包括'\0' ,这样就引起了问题
memset(a, 0, sizeof(a));
strcpy(a, b);
printf("a=%s\n",a);
printf("b=%s\n",b);
system("pause");
return 0;
}

你就会发现 有区别了

pcboyxhy 2005-03-17
  • 打赏
  • 举报
回复
memset是针对内存初始化的
无论是什么类型的,
都可以,
只是结果不能保证。
它一般是用来将一片内存按照字节全部写入0的
pcboyxhy 2005-03-17
  • 打赏
  • 举报
回复
strncpy(b, &a[9], strlen(&a[9]));
memset(a, 0, sizeof(a));
strncpy(a, b,strlen(b));
主要是strncpy的问题
The strncpy() function copies at most count characters of from to the string to. If from has less than count characters, the remainder is padded with '\0' characters.
也就是说
执行这个函数并不会在你要copy到的目标字符串末尾加 '\0',除非源字符串的长度 < 你给的长度。
pcboyxhy 2005-03-17
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
char a[60]= "chinacsdnchinacsdnchinacsdn";
char b[30];
memset(b, 0, sizeof(b));
strncpy(b, &a[9], strlen(&a[9]));
memset(a, 0, sizeof(a));

strncpy(a, b,strlen(b));

printf("%s\n%s\n", a, b);
system("PAUSE");
return 0;
}

69,371

社区成员

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

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