C中char []和char *之间的区别[重复]
Posted
技术标签:
【中文标题】C中char []和char *之间的区别[重复]【英文标题】:Difference between char[] and char * in C [duplicate] 【发布时间】:2014-11-07 01:19:48 【问题描述】:C 中的 char[] 和 char * 有什么区别? 我知道两者都创建 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。
【问题讨论】:
【参考方案1】:使用char s[] = "hello";
时,char数组是在当前函数的作用域内创建的,因此进入函数时在栈上分配内存。
当使用char *s = "hello";
时,s
是一个指向常量字符串的指针,编译器将其保存在程序的一块内存中,该内存块被阻止写访问,因此出现分段错误。
【讨论】:
【参考方案2】:在这两种情况下,一个常量字符串"hello\0"
被分配在可执行映像的只读部分中。
在char* s="hello"
的情况下,每次调用函数时,变量s
被设置为指向该字符串在内存中的位置,所以它可以用于读操作(c = s[i]
),但是不适用于写操作 (s[i] = c
)。
在char s[]="hello"
的情况下,数组s
在每次调用函数时都会被分配到栈上并填充该字符串的内容,因此它可以用于读取操作(c = s[i]
)和用于写操作 (s[i] = c
)。
【讨论】:
【参考方案3】:一个是指针,另一个是数组。
数组定义了保留在当前作用域堆栈空间中的数据。
指针定义了当前作用域栈空间中的内存地址,但它从堆中引用内存。
【讨论】:
以上是关于C中char []和char *之间的区别[重复]的主要内容,如果未能解决你的问题,请参考以下文章
main() 的第二个参数的 char *argv[] 和 char **argv 之间的区别 [重复]
C中sizeof与char a []和char * a有什么区别? [重复]