字符串初始化数组

时间:2014-08-25 15:28:50

标签: c arrays initialization

这段代码交换给定数组的第一个和最后一个元素:

#include <stdio.h>

/* swap first and last element of array */
void fn(void *v, size_t length, size_t size)
{
    char *a = (char *)v;
    char *b = (char *)v + size * (length - 1);
    char temp;

    do {
        temp = *a;
        *a++ = *b;
        *b++ = temp;
    } while (--size > 0);
}

int main(void)
{
    int a[] = {0, 1, 2};
    double b[] = {0., 1., 2.};
    char c[][15] = {"Hello", ",", "this is a test"};

    fn(a, 3, sizeof(a[0]));
    fn(b, 3, sizeof(b[0]));
    fn(c, 3, sizeof(c[0]));
    printf("%d %d\n", a[0], a[2]);
    printf("%f %f\n", b[0], b[2]);
    printf("%s %s\n", c[0], c[2]);
    return 0;
}

输出:

2 0
2.000000 0.000000
this is a test Hello

我的问题是:

代码是安全的吗?保证c[0]由编译器初始化为

{'h', 'e', 'l', 'l', 'o', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}

c[0]可能包含{'h', 'e', 'l', 'l', 'o', 0, [garbage]}

修改: 如果c未初始化?

int main(void)
{
    char c[3][15];

    strcpy(c[0], "Hello");
    strcpy(c[1], ",");
    strcpy(c[2], "this is a test");
    fn(c, 3, sizeof(c[0]));
    printf("%s %s\n", c[0], c[2]);
    return 0;
}

使用fn是否安全? (c[0]包含9个字节的垃圾)

2 个答案:

答案 0 :(得分:5)

从C11-Standard章节6.7.9:

  

21如果括号括起的列表中的初始值设定项少于元素或成员   用于初始化已知数组的字符串文字中的聚合或更少字符   大小比数组中的元素大,其余的聚合应该是   隐式初始化与具有静态存储持续时间

的对象相同

是的,c[0]将完全初始化。

这也由C99标准(第6.7.8 / 21章)定义。对于标准的早期版本,我不知道这个(不再......; - ))。

答案 1 :(得分:2)

你问:

  

保证c[0]由编译器初始化为

{'h', 'e', 'l', 'l', 'o', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}

是的,语言可以保证。它零初始化未明确初始化的数组元素。