免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5951 | 回复: 4
打印 上一主题 下一主题

一个memset引出的段错误。。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-04 19:24 |只看该作者 |倒序浏览
写了个memset函数,但第一个版本居然告诉我段错误(segementation fault,GCC编译)!百思不得其解。代码如下:

  1. #include<stdio.h>
  2. typedef struct student{
  3.         int x;
  4.         int y;
  5. }Node;

  6. int memset2(void* to,int num,int len)
  7. {
  8.         int res=0;
  9.         int* tmp=(int*)to;
  10.         printf("tmp=%x\n",tmp);
  11.         while(len--){*tmp=num;tmp++;}res=1;
  12.         printf("after memset,tmp=%x\n",tmp);
  13.         return res;
  14. }
  15. main()
  16. {
  17.         int res=0;
  18.         Node st11;
  19.         Node* st1=&st11;
  20.         res=memset2(st1,23,sizeof(Node));
  21. }
复制代码


于是去看Linux的源代码,发现就一处和我不一样,就是memset里的所有临时和传入变量的参数都是char类型的,遂改之,如下:

  1. int memset2(void* to,char num,int len)
  2. {
  3.         int res=0;
  4.         char *tmp=(char*)to;
  5.         printf("tmp=%x\n",tmp);
  6.         while(len--){*tmp=num;tmp++;}res=1;
  7.         printf("after memset,tmp=%x\n",tmp);
  8.         return res;
  9. }
复制代码


结果编译运行全部正常。。那么。。这是怎么回事呢?我首先觉得可能是printf里面访问了未初始化的指针,这些未初始化指针指向了内存的保护段,比如printf("%s",1)当然会出错啦(虽然我很肯定我未使用这些未初始化指针。)好吧。。不管了。。先把所有printf注释掉。。。结果我崩溃,int类型时还是出现同样错误。

结果还是百思不得其解。。。。忘高手指点一下。

论坛徽章:
0
2 [报告]
发表于 2008-01-04 19:48 |只看该作者
问题解决了。。sizeof(Node)为8,如果而我一个结构体里面只有两个Int,Memset相当于set了8个int,使用了未声明的内存造成的。。

论坛徽章:
0
3 [报告]
发表于 2008-02-02 17:51 |只看该作者
主要的错误在于tmp++是每次地址加sizeof(int)吧
res=memset2(st1,23,sizeof(Node)); 这个调用的目的是什么呢,看不懂

论坛徽章:
0
4 [报告]
发表于 2008-02-03 12:51 |只看该作者
you misunderstand memset()'s syntax:

void *memset(void *s, int c, size_t n);

The memset() function fills the first n bytes of the memory area pointed to by s with the constant byte c.

Note: the unit of 3rd parameter of memset() is byte, not int.

论坛徽章:
0
5 [报告]
发表于 2008-02-03 15:29 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP