段错误汇总
.|下面的代码是否可以正常运行?为什么?
代码一:
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”;
printf("buf1: %p \n", buf1);<br /> printf("buf2: %p \n", buf2);<br />}
.|
下面是命令的输出结果,明显可以看出buf1的存储区域要小于buf2。
buf1: 0x5555555547b4
buf2: 0x7fffffffd940
从下面的图可以看出,buf1存储的区域,和buf2存储区域的差别。
buf2位于栈中,而buf1位于只读静态存储区
