C中的字符串初始化声明

时间:2014-10-09 03:38:30

标签: c string initialization

我在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的第二个答案。

4 个答案:

答案 0 :(得分:1)

  1. 不 - 总的来说。但在某些情况下是的。具体来说,如果变量是局部变量而不是static,那么它根本不会被初始化。如果变量是本地变量static,或者变量是文件范围和static,或者它是全局的,那么它将被初始化为所有字节零。

  2. 没有。 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…
    }
    
  3. 使用:

    就足够了
    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个字节,然后是字符串终止符(值为零的字节)。