#include
int main()
{
char *p=NULL;
scanf("%s",p);
printf("%s",p);
return 0;
}
这段代码我在ios的终端下运行就提示Segmentation fault:11
但是不给p赋初值的话。。改称char *p;反而好使了。。为什么。。。
请教别人说是编译器的问题。能不能稍微详细的说一下为什么。。
新手请教一个c的问题,关于指针赋初始值
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
9条回答
- 微型蚂蚁 2014-12-02 09:39关注
要先弄清楚scanf的参数用途,
这里scanf将要在p指定的地址上写入用户输入的字符串
操作系统装载程序的时候会将虚拟内存地址划分成多个区域,其中包括reserved, readonly等是从低地址开始的也就是从0开始,这部分内存程序不能读写,如果试图读写就会出现segment fault
除了一些不能读写的区域外的很大部分是可以被读写。
所以如果指定了p=NULL肯定会出现错误。
但是如果不指定,那p的值由编译器决定,如果p刚好被赋值为可读写区域就不会报错,具体地址可以用printf打印出来看一下。
具体可以看看《链接装载与库》这本书,第十章第一节就讲的这个问题本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报