以下工作原理如何?
char *str="string";
printf("str is %s\n",str);
但下面的一个给出了分段错误
int *i=3;
printf("int is %d\n",*i);
答案 0 :(得分:7)
"string"
之类的字符串文字是存储在只读内存位置的char[7]
。数组名称可以衰减为指向其第一个元素的指针,因此可以将char*
初始化为这样的文字表达式。
3
之类的整数文字只是一个不存储在任何地方的整数。初始化int* i = 3
初始化i
以指向值为3
的内存位置。这不太可能是有效的位置,这就是取消引用i
会导致分段违规的原因。
答案 1 :(得分:3)
如果是字符串文字,编译器会在内存中为其分配空间。 str
将使用分配的块的起始地址进行初始化
如果是int *i=3;
,编译器会使用地址值i
初始化3
。通常较低的地址是为操作系统保留的,程序很可能在访问这些位置时崩溃