免费注册 查看新帖 |

Chinaunix

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

Linux下不会出现野指针嘛 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-17 15:50 |只看该作者 |倒序浏览
#include<stdio.h>

int main(int argc,char ** argv)
{
        FILE * fp = NULL;
        char * buf = "中国";

        if(NULL == (fp = fopen("file.f","w+")))
        {
                fprintf(stderr,"can not open file.f\n");
                return 1;
        }

        fwrite(buf,strlen(buf)+1,1,fp);
        fputc('\n',fp);
        char * msg=NULL;

        fseek(fp,0L,SEEK_SET);

        fread(msg,strlen(buf)+1,1,fp);
        printf("%s\n",msg);
        fclose(fp);
        fp = NULL;
        return 0;
}

如红色部分初始化的话,GCC 编译通过,运行会报段错误.
而红色部分若不对msg初始化就不会报错,何解?
指针没有初始化呀,怎么反而能得到答案?

[ 本帖最后由 gabrielhoo2008 于 2009-3-17 16:24 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-03-17 16:56 |只看该作者
strace 你的程序,发现程序收到SIGSEGV,这个信号是由于进程试图写一个只读区域造成的.
msg=malloc(sizeof(char));

论坛徽章:
0
3 [报告]
发表于 2009-03-17 17:07 |只看该作者
结果正确就表示程序正确么?没错只是你运气好。。。

PS:本版版主和很多热心CUser很辛苦地在顶上搞了个FAQ,有空去看看撒。。。

论坛徽章:
0
4 [报告]
发表于 2009-03-17 17:39 |只看该作者
呵呵 二楼提出的问题我用GDB调试的时候已经知道
由于以前接触Linux C比较少 所以对于今天这个问题十分好奇.

论坛徽章:
0
5 [报告]
发表于 2009-03-17 22:27 |只看该作者
msg未初始化的话,它就是一个野指针。恰好它指向了一个可被访问的地址,所以就没有出错(此时这个野指针很可能指向另外一个或多个已经分配的变量上面)。
但是,如果程序继续运行下去,说不定什么时候你就发现BUG了。于是,费尽心思调试BUG,终于发现,在某一时刻,某个变量莫名其妙地被篡改了……然后很无语地发现,原来是野指针惹的祸。

论坛徽章:
0
6 [报告]
发表于 2009-03-17 22:45 |只看该作者
这个问题恐怕不是LinuxC问题,而是C问题

论坛徽章:
0
7 [报告]
发表于 2009-03-17 23:00 |只看该作者
和Linux没有什么太大关系,楼主可以再看看<C专家编程> 以及 <C陷阱与缺陷>这两本书!强烈推荐

论坛徽章:
5
8 [报告]
发表于 2009-03-18 11:38 |只看该作者
原帖由 kouu 于 2009/3/17 22:27 发表
msg未初始化的话,它就是一个野指针。恰好它指向了一个可被访问的地址,所以就没有出错(此时这个野指针很可能指向另外一个或多个已经分配的变量上面)。
但是,如果程序继续运行下去,说不定什么时候你就发现 ...


很多貌似莫明其妙的错误, 是这种原因引起的.

论坛徽章:
0
9 [报告]
发表于 2009-03-18 11:47 |只看该作者
建议楼主把C指针部分再学一遍。

论坛徽章:
0
10 [报告]
发表于 2009-03-18 12:14 |只看该作者
可能大家没有明白我的意思
我的意思是说,首先在做这个代码的时候,我在定义的时候就把msg赋值为NULL
然后程序编译没有错误,运行的时候出现段错误.
后来用GDB调试的时候提示指针指向有问题,指针指向0X00,
不可访问的区域.
再然后,我就想,干脆不初始化再看看会是什么情况,最后运行结果是想要的.

现在我不明白的就是,我初始化不能把指针赋为NULL嘛?

至于跟Linux相不相关,在这里我就糊涂了,因为原则上NULL不会有问题吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP