TinoIsANewGuy 2014-12-02 07:57 采纳率: 50%
浏览 2144
已采纳

新手请教一个c的问题,关于指针赋初始值

#include
int main()
{
char *p=NULL;
scanf("%s",p);
printf("%s",p);
return 0;
}
这段代码我在ios的终端下运行就提示Segmentation fault:11
但是不给p赋初值的话。。改称char *p;反而好使了。。为什么。。。
请教别人说是编译器的问题。能不能稍微详细的说一下为什么。。

  • 写回答

9条回答 默认 最新

  • 微型蚂蚁 2014-12-02 09:39
    关注

    要先弄清楚scanf的参数用途,
    这里scanf将要在p指定的地址上写入用户输入的字符串
    操作系统装载程序的时候会将虚拟内存地址划分成多个区域,其中包括reserved, readonly等是从低地址开始的也就是从0开始,这部分内存程序不能读写,如果试图读写就会出现segment fault
    除了一些不能读写的区域外的很大部分是可以被读写。
    所以如果指定了p=NULL肯定会出现错误。
    但是如果不指定,那p的值由编译器决定,如果p刚好被赋值为可读写区域就不会报错,具体地址可以用printf打印出来看一下。
    具体可以看看《链接装载与库》这本书,第十章第一节就讲的这个问题

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(8条)

报告相同问题?

悬赏问题

  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置