在C中声明字符串的区别

这两个在C语言中有何不同?

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

//and 

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

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

但是如果是这种情况,这两个如何存储在内存中?

a200512 回答:在C中声明字符串的区别

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';

可能正常工作,或者可能导致运行时错误,或者可能根本不执行任何操作。

为了安全起见,应将指向字符串文字的指针声明为const char *

const char *str = "xyz";

那样,如果你写类似的东西

str[i] = 'X';

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

本文链接:https://www.f2er.com/3141550.html

大家都在问