静态大小的字符串声明
Character string declaration with static size
我正在尝试用不同的方式在 C 语言中声明一个字符串来准备考试。我们知道C语言中的string就是以'[=11=]'
结尾的字符数组。然后我发现即使我声明一个5个字符的数组并像"abcde"一样在其中放入5个字符它也是被接受的。那么空字符存储在哪里?
我通过以下方式声明了字符串
char str[] = {'a','b','c','d','e'};
char str2[] = "abcde";
char str3[5] = "abcde";
现在,在第 3 种情况下,我分配了 space 的 5 个字节并且我在数组中恰好有 5 个字符,那么如果字符串末尾应该有一个空字符,它存储在哪里?还是没有附加 null 的情况?
第一种和第二种情况呢,那里附加了 null 吗?
strlen()
returns 3 种情况均为 5。
第三种情况,没有追加空终止符。来自 documentation:
If the size of the array is known, it may be one less than the size of
the string literal, in which case the terminating null character is
ignored:
所以当你用 strlen
检查它的长度时,你会得到未定义的行为(当你用第一个尝试它时也是如此,因为它也不是字符串)。
任何不允许的,(对我来说,在 MSVC 上它显示错误但由于某种原因仍然编译它)。允许超过字符串长度,在这种情况下,其余部分将被零初始化。
NUL
字符仅存储在第二个示例中
char str2[] = "abcde";
自动调整数组大小以包含它。字符数组 没有 是字符串,另外两个是没有 NUL
终止符的编码。
如果代码碰巧将它们正确地视为字符串,那是 未定义行为 的不幸结果。
#include <stdio.h>
int main(int argc, char *argv[])
{
char str[] = {'a','b','c','d','e'};
char str2[] = "abcde";
char str3[5] = "abcde";
printf("%zu\n", sizeof str);
printf("%zu\n", sizeof str2);
printf("%zu\n", sizeof str3);
}
程序输出:
5
6
5
我正在尝试用不同的方式在 C 语言中声明一个字符串来准备考试。我们知道C语言中的string就是以'[=11=]'
结尾的字符数组。然后我发现即使我声明一个5个字符的数组并像"abcde"一样在其中放入5个字符它也是被接受的。那么空字符存储在哪里?
我通过以下方式声明了字符串
char str[] = {'a','b','c','d','e'};
char str2[] = "abcde";
char str3[5] = "abcde";
现在,在第 3 种情况下,我分配了 space 的 5 个字节并且我在数组中恰好有 5 个字符,那么如果字符串末尾应该有一个空字符,它存储在哪里?还是没有附加 null 的情况?
第一种和第二种情况呢,那里附加了 null 吗?
strlen()
returns 3 种情况均为 5。
第三种情况,没有追加空终止符。来自 documentation:
If the size of the array is known, it may be one less than the size of the string literal, in which case the terminating null character is ignored:
所以当你用 strlen
检查它的长度时,你会得到未定义的行为(当你用第一个尝试它时也是如此,因为它也不是字符串)。
任何不允许的,(对我来说,在 MSVC 上它显示错误但由于某种原因仍然编译它)。允许超过字符串长度,在这种情况下,其余部分将被零初始化。
NUL
字符仅存储在第二个示例中
char str2[] = "abcde";
自动调整数组大小以包含它。字符数组 没有 是字符串,另外两个是没有 NUL
终止符的编码。
如果代码碰巧将它们正确地视为字符串,那是 未定义行为 的不幸结果。
#include <stdio.h>
int main(int argc, char *argv[])
{
char str[] = {'a','b','c','d','e'};
char str2[] = "abcde";
char str3[5] = "abcde";
printf("%zu\n", sizeof str);
printf("%zu\n", sizeof str2);
printf("%zu\n", sizeof str3);
}
程序输出:
5 6 5