我有一些关于 C 语言字符串初始化和声明的问题。
假设如果我使用声明一个大小为 10 的字符串
char s[10];
问 1. 's' 中的所有元素是否必须都初始化为 '\0' 还是纯属运气好,我会发现其他元素都为 '\0'?
问题 2. 如果我使用 malloc 来设置这样的字符串
char *s = malloc(10 * sizeof(char));
是否有必要将所有元素都初始化为“\0”?
问 3. 声明字符串时还需要添加 '\0' 吗?
char s[10] = "abc";
或者是必须如此
char s[10] = "abc\0";
注意:如果可能的话,请看一下 Kevin here 的第二个答案。 .
最佳答案
没有——一般来说。但在某些情况下是的。具体来说,如果变量是局部变量而不是
static
,那么它根本就不会被初始化。如果变量是本地且静态
,或者如果变量是文件范围且静态
,或者如果它是全局变量,则它将被初始化为所有字节零。没有。
malloc()
不保证返回归零的内存。如果您需要将其归零,请使用calloc()
。这些注释适用于任何类型。
char s0[10]; // Initialized all bytes zero static char s1[10]; // Initialized all bytes zero void somefunc(void) { static char s2[10]; // Initialized all bytes zero char s3[10]; // Not initialized to all bytes zero char *s4 = malloc(10); // Not initialized to all bytes zero char *s5 = calloc(10, 1); // Initialized all bytes zero …code using s0..s5… }
使用就足够了:
char s6[10] = "abc"; // 3 bytes non-zero plus 7 bytes zero
这样写会得到相同的结果,因为数组的大小是指定的:
char s7[10] = "abc\0"; // 3 bytes non-zero plus 7 bytes zero
编写这些给出两个不同大小的数组:
char s8[] = "abc"; // sizeof(s8) == 4 – 1 null byte char s9[] = "abc\0"; // sizeof(s9) == 5 – 2 null bytes
C 自动添加尾随空字节。
关于c - C 中的字符串初始化声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26269912/