C中char []和char*之间的区别

Pri*_*iJC 5 c string pointers

C中的char [] s和char*s有什么区别?我知道两者都创建了make's'指向字符数组的指针.然而,

char s[] = "hello";
s[3] = 'a';
printf("\n%s\n", s);
Run Code Online (Sandbox Code Playgroud)

打印helao,而

char * s = "hello";
s[3] = 'a';
printf("\n%s\n", s);
Run Code Online (Sandbox Code Playgroud)

给我一个分段错误.为什么会有这样的差异?我在Ubuntu 12.04上使用gcc.

Het*_*oni 9

使用时char s[] = "hello";,char数组在当前函数的范围内创建,因此在进入函数时,内存将在堆栈上分配.

使用时char *s = "hello";,s是一个指向常量字符串的指针,编译器将其保存在程序的内存块中,该内存块被阻止进行写访问,从而导致分段错误.


bar*_*nos 5

在这两种情况下,"hello\0"在可执行映像的只读部分中分配常量字符串.

在这种情况下char* s="hello",s每次调用函数时,变量都设置为指向该字符串在内存中的位置,因此它可以用于读取操作(c = s[i]),但不能用于写入操作(s[i] = c).

在这种情况下char s[]="hello",s每次调用函数时,数组都在堆栈上分配并填充该字符串的内容,因此它可用于读取操作(c = s[i])和写入操作(s[i] = c).