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

报告相同问题?

悬赏问题

  • ¥20 测距传感器数据手册i2c
  • ¥15 RPA正常跑,cmd输入cookies跑不出来
  • ¥15 求帮我调试一下freefem代码
  • ¥15 matlab代码解决,怎么运行
  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法