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

时间:2014-09-12 19:26:57

标签: c string pointers

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

char s[] = "hello";
s[3] = 'a';
printf("\n%s\n", s);

打印helao,而

char * s = "hello";
s[3] = 'a';
printf("\n%s\n", s);

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

3 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:0)

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

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

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