在c中声明期间初始化指针

时间:2015-03-21 15:17:14

标签: c

以下工作原理如何?

char *str="string";
printf("str is %s\n",str);

但下面的一个给出了分段错误

int *i=3;
printf("int is %d\n",*i);

2 个答案:

答案 0 :(得分:7)

"string"之类的字符串文字是存储在只读内存位置的char[7]。数组名称可以衰减为指向其第一个元素的指针,因此可以将char*初始化为这样的文字表达式。

3之类的整数文字只是一个不存储在任何地方的整数。初始化int* i = 3初始化i以指向值为3的内存位置。这不太可能是有效的位置,这就是取消引用i会导致分段违规的原因。

答案 1 :(得分:3)

如果是字符串文字,编译器会在内存中为其分配空间。 str将使用分配的块的起始地址进行初始化 如果是int *i=3;,编译器会使用地址值i初始化3。通常较低的地址是为操作系统保留的,程序很可能在访问这些位置时崩溃