【问题标题】:Difference in declaring strings in C在 C 中声明字符串的区别
【发布时间】:2019-11-07 21:24:13
【问题描述】:

这两个在 C 中有何不同?

char str[] = "xyz";         // statement 1

//and 

char str[4] = "xyz";        // statement 2

根据我的理解,第一个分配一个指向字符串文字的指针,而第二个是一个 4 个字符的字符数组(包括NULL 字符)。

但是如果是这样的话,这两个是怎么存入内存的呢?

【问题讨论】:

  • 他们不是。两者都是静态分配的 4 个元素的字符数组(其中第四个是 NUL 终止符\0)。
  • 没有。两种情况是等价的。这个会有所不同:char *str = "xyz"; 将属于您的第一个描述。
  • 看看区别:godbolt.org/z/fSh5qR(编译后的代码是一样的)
  • 第一个分配一个指向字符串文字的指针你从哪里得到这个想法?这完全是假的。

标签: c string memory-management


【解决方案1】:
char str[] = "xyz";  

str 声明为char 的4 元素数组,并将字符串初始值设定项的内容复制到其中:

     +---+---+---+---+
str: |'x'|'y'|'z'| 0 |
     +---+---+---+---+

在这种情况下,数组的大小取自初始值设定项的大小(3 个字符加上字符串终止符)。

char str[4] = "xyz";

做同样的事情,除了明确指定大小。

在这两种情况下,str 的内容都是可写的——你可以修改字符串的字符,如下所示:

str[0] = 'X';
str[1] = 'Y';
...

字符串的最大长度是固定的,但是 - 您在 str 中最多只能存储 3 个字符(加上 0 终止符)的字符串。

如果你声明了它

char *str = "xyz";

那么str 将是指向字符串literal 的第一个元素的指针,如下所示:

    +---+      +---+---+---+---+
str:|   | ---> |'x'|'y'|'z'| 0 |
    +---+      +---+---+---+---+

所有str 存储的是字符串第一个字符的地址。在这种情况下,尝试修改字符串中的任何字符都会导致未定义的行为假定字符串文字是不可变的,但它们不一定存储在只读内存中。类似代码

str[0] = 'X';

可能按预期工作,或者它可能导致运行时错误,或者它可能什么都不做。

为了安全起见,您应该将指向字符串文字的指针声明为<em>const</em> char *

const char *str = "xyz";

如果你写这样的东西

str[i] = 'X';

编译器会为此大喊大叫,因此您不必等到运行时才发现错误。

【讨论】:

  • @chux-ReinstateMonica:将措辞从“literal”更改为“initializer”。希望这更准确一些。
猜你喜欢
  • 1970-01-01
  • 2013-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 2013-02-18
相关资源
最近更新 更多