c - C 中的字符串初始化声明

标签 c string initialization

我有一些关于 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 的第二个答案。 .

最佳答案

  1. 没有——一般来说。但在某些情况下是的。具体来说,如果变量是局部变量而不是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 自动添加尾随空字节。

关于c - C 中的字符串初始化声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26269912/

相关文章:

c - 返回地址和返回指针的区别

c - 如何按特定顺序设置位字段并稍后根据该顺序进行检查

检查数组的第一个元素是否是 C 中的数字

c++ - 如何在C++中动态创建 vector

swift - 无法分配给值 : 'self' is immutable

c - 计算行数、字符数、数字和关键字数的 Lex 程序

c++ - 需要有关反转输入的递归程序的帮助

java - 如何从循环外部访问在嵌套循环中声明或初始化的数组或变量?

带点的Java数组(协调)

c - 从函数传递和返回结构体