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条)

报告相同问题?

悬赏问题

  • ¥50 树莓派安卓APK系统签名
  • ¥15 maple软件,用solve求反函数出现rootof,怎么办?
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗