【问题标题】:Difference between char[] and char * in C [duplicate]C中char []和char *之间的区别[重复]
【发布时间】: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。

【问题讨论】:

    标签: c string pointers


    【解决方案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】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-16
          • 2020-07-10
          • 2018-03-05
          • 2011-03-07
          • 1970-01-01
          • 2018-03-30
          相关资源
          最近更新 更多