14

这两行代码是否达到了相同的结果?如果我在函数中有这些行,那么字符串是否在两种情况下都存储在堆栈中?除了不需要在第一行代码中声明空终止符之外,我是否有充分的理由使用一个而不是另一个?

char  s[] = "string";
char* s   = "string\0";
4

3 回答 3

29

不,这两条线没有达到相同的结果。

char s[] = "string"生成一个 7 字节的可修改数组,该数组最初填充了内容's' 't' 'r' 'i' 'n' 'g' '\0'(所有内容在运行时从字符串文字复制过来)。

char *s = "string"导致指向一些包含字符串文字“字符串”的只读内存的指针。

如果要修改字符串的内容,那么第一个是唯一的方法。如果您只需要对字符串进行只读访问,那么第二个会稍微快一些,因为不必复制字符串。


在这两种情况下,都不需要在字符串文字中指定空终止符。编译器会在遇到关闭时为您解决这个问题。

于 2010-10-29T11:41:57.390 回答
4

这两者的区别:

char a[] = "string";
char* b = "string";

是 a 实际上是堆栈上的静态数组,而 b 是指向常量的指针。您可以修改 a 的内容,但不能修改 b。

于 2010-10-29T11:42:37.433 回答
3

除了其他答案之外,我将尝试解释为什么您不能*s稍后在程序流程中修改变量。

从概念上讲,当程序加载到内存中时,它有 3 个区域(段):

  • 代码段:你的程序的文本存储在这里(它是一个只读区域)
  • 数据段:包含任何具有预定义值并且可以修改的全局或静态变量
  • 堆栈段:这里加载了被调用的函数。为每个函数调用推入堆栈的一组值(堆栈帧),其中包含函数的返回地址和局部变量。

在您的情况下,s[]变量是函数中的局部变量(数组),main()它使用 value 初始化"string"。因此,它存储在堆栈中并且可以修改。

*s变量是一个指向地址的指针 ,"string\0"一个位于代码段中的常量。作为只读区域,您无法修改其内容。

于 2017-06-26T22:21:59.863 回答