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有什么区别? [重复]

MySQL - Char 和 Varchar 之间的区别? [复制]

指针和数组之间的区别[重复]

char和unsigned char--数据类型区别

TCHAR和char的区别是啥?