开发者社区> 问答> 正文

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

#include
int main()
{
char *p=NULL;
scanf("%s",p);
printf("%s",p);
return 0;
}

这段代码我在ios的终端下运行就提示Segmentation fault:11
但是不给p赋初值的话。。改称char *p;反而好使了。。为什么。。。
请教别人说是编译器的问题。能不能稍微详细的说一下为什么

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

    2019-07-17 19:08:25
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载