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。
答案 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)
一个是指针,另一个是数组。
数组定义保留在当前作用域堆栈空间中的数据。
指针定义了当前作用域堆栈空间中的内存地址,但它引用了堆中的内存。