gpt4 book ai didi

c - 使用字符串文字初始化字符数组的更好方法是什么?

转载 作者:太空狗 更新时间:2023-10-29 14:51:09 25 4
gpt4 key购买 nike

我是 C 语言的新手。我试图理解 C 中数组的概念。我对数组初始化感到困惑。

哪种使用字符串字面量初始化字符数组的方法更好?

char arr[3] = "xyz";

char arr[] = "xyz";

提前致谢。

最佳答案

除非在特殊情况下,总是首选第二种方式,即不显式输入数组的大小。这避免了您在示例中似乎未引起注意的错误。

要理解这一点,首先要理解什么是字符串。空字符由 '\0' 表示。字符串是一系列零个或多个非空 char以单个空字符结尾。最后一点非常重要。看下面的代码:

const char* my_string = "xyz";
size_t string_len = strlen( my_string ); // string_Len == 3

指针只是一个内存地址。它本身不包含任何类型的大小或长度信息。那么,strlen()如何测量my_string的长度呢?当然,这是通过测量从字符串开头到终止空字符之前的非空字符的数量来实现的。您现在可能已经注意到终止空字符在字符串文字中是隐式。上面的字符串文字在内存中创建了一个数组,如下所示:

 _______ _______ _______ _______
| | | | |
| 'x' | 'y' | 'z' | '\0' |
|_______|_______|_______|_______|
^
|
`my_string` is a pointer to this cell

数组本身未命名,但编译器设法将其第一个元素的地址作为 my_string 的值。那么,您的第一个示例会怎样?

char my_string[ 3 ] = "abc";

根据标准的定义,字符串文字的类型为 char[ N ],其中 N 是字符串的长度加一以计算空字符(注意字符串文字由于历史原因未声明 const,但修改它们仍然是未定义的行为)。因此,上述表达式 "abc" 的类型为 char[ 4 ]。另一方面,my_string(顺便说一句,它现在是一个数组,而不是指针)的类型是 char[3]。也就是说,您将一个较小的数组设置为一个较大的数组,因为 4 > 3。该标准规定,在这种精确情况下,如果字符串文字的空字符不适合数组,则应将其切断。因此,my_string 在内存中看起来像这样:

 _______ _______ _______
| | | |
| 'a' | 'b' | 'c' |
|_______|_______|_______|

看起来不错,但是……等等。终止空字符在哪里?您通过显式声明数组的大小来切断它!现在,strlen() 应该如何确定字符串的长度?它将继续读取字符串后面的字符,直到巧合地发现空字符。这是未定义的行为。另一方面,通过这样做:

const char[] my_string = "abc";

您不会冒险这样做。 my_string 的类型将自动推导为 const char[ 4 ],并保留空字符。

tl;dr 不要忘记终止空字符!

关于c - 使用字符串文字初始化字符数组的更好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42049003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com