关于字符串:C中char[]和char*的区别

Difference between char[] and char * in C

本问题已经有最佳答案,请猛点这里访问。

C中char[]s和char*s的区别是什么?我知道这两者都创建了一个指向字符数组的指针。然而,

1
2
3
4
5
char s[] ="hello";
s[3] = 'a';
printf("
%s
"
, s);

打印helao,而

1
2
3
4
5
char * s ="hello";
s[3] = 'a';
printf("
%s
"
, s);

给了我一个分割错误。为什么会有这样的区别?我在Ubuntu 12.04上使用gcc。


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

当使用char *s ="hello";时,s是一个指向常量字符串的指针,编译器将该常量字符串保存在程序的内存块中,该内存块为写访问而被阻止,因此存在分段错误。


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

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

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


一个是指针,另一个是数组。

数组定义保留在当前作用域堆栈空间中的数据。

指针定义了当前作用域堆栈空间中的内存地址,但该地址引用了堆中的内存。