我在C中有一些关于字符串初始化和声明的问题。
假如我宣布一个字符串' s'大小为10使用
char s[10];
问:1。是否有必要使用'的所有要素。将被初始化为' \ 0'或者只是纯粹的运气,我会发现其他元素是' \ 0'?
问2.如果我改为使用malloc来设置像这样的字符串
char *s = malloc(10 * sizeof(char));
同样有必要将所有元素初始化为' \ 0'?
问3.此外,我还需要添加' \ 0'同时声明字符串?
char s[10] = "abc";
或者它必须是
char s[10] = "abc\0";
注意:如果可能,请查看Kevin here的第二个答案。
答案 0 :(得分:1)
不 - 总的来说。但在某些情况下是的。具体来说,如果变量是局部变量而不是static
,那么它根本不会被初始化。如果变量是本地变量static
,或者变量是文件范围和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会自动添加一个尾随空字节。
答案 1 :(得分:1)
首先,您的s
不是“字符串”。您的s
是字符数组。术语 string 是指字符数组的内容。为了有资格作为字符串,内容必须满足一些要求。 string 定义为以零字符终止的连续字符序列。
Q1。如果使用 static 存储持续时间声明数组,则它将以其中的所有零开始生命。在所有其他情况下,它将包含不可预测的垃圾。
Q2。 malloc
不初始化已分配的内存。内存中包含不可预测的垃圾。 calloc
分配用零初始化的字符数组。
Q3。初始化右侧的内容称为 string literal 。字符串文字已隐式包含终止零字符。没有必要明确添加它。
但是,C语言遵循全有或全无的初始化方法。如果只初始化某个聚合对象的一小部分,则该对象的其余部分将使用零隐式初始化。在你的情况下,这意味着数组s
的其余部分将一直填充为零,一直到最后。因此,两个初始化示例的最终结果没有区别。但是,明确指定零字符毫无意义。
答案 2 :(得分:0)
如果您使用char s[10];
或malloc
声明字符串,则内容不会初始化为\0
或其他任何内容。它将包含垃圾值。因此,如果您的字符串中需要\0
,则需要明确存储它。
此外,如果你像
那样做声音char s[10] = "abc";
然后,您不需要添加\0
,
注意:如果您使用calloc
代替malloc
来分配内存,则内容将初始化为0
。
答案 3 :(得分:0)
Q1。如果您没有显式初始化局部变量,那么它可以包含任何值。通常,字节恰好包含零。
但静态变量(在任何函数之外声明或以static关键字为前缀)都保证初始化为零。
Q2。同样,malloc不会清除它们的内存,但它往往会被零填充。要显式获取零填充内存,请使用calloc()。
Q3。您不需要在双引号内添加\ 0。字符串" abc"表示在包含3个字符的某处创建4个字节,然后是字符串终止符(值为零的字节)。