这段代码交换给定数组的第一个和最后一个元素:
#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个字节的垃圾)
答案 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}
是的,语言可以保证。它零初始化未明确初始化的数组元素。