段错误汇总

.|下面的代码是否可以正常运行?为什么?

代码一:
char buf = “asr:157”; buf=12; 代码二: char buf[] = “asr:157”; *buf=12;

.|代码二可以正常运行。
代码一会报段错误,因为用字符串初始化指针时,字符串会被存储在静态存储区(常量区),不能被改写。
.+

.|下面两个字符串的声明有什么区别?各自存储在什么区域?

char *buf1 = “asr:157”; char buf2[] = “asr:157”;

.|buf1会被存在静态存储区,属于只读区域,只要写入该段,就会报段错误。
buf2存储在栈中,可读可修改。
.+

.|下面代码输出,两个地址有什么区别?

include
int main(int argc, char argv[])
{
//char buf[] = “asr:157”; char
buf1 = “asr:157”;
char buf2[] = “asr:157”;

  1. printf("buf1: %p \n", buf1);<br /> printf("buf2: %p \n", buf2);<br />}

.|
下面是命令的输出结果,明显可以看出buf1的存储区域要小于buf2。

buf1: 0x5555555547b4
buf2: 0x7fffffffd940

从下面的图可以看出,buf1存储的区域,和buf2存储区域的差别。
buf2位于栈中,而buf1位于只读静态存储区
image.png