一维数组不初始化长度编译器为什么没有警告?
#include <stdio.h>
#include <string.h>
int main()
{
char a[]={};
scanf("%s",a);
printf("%lu",strlen(a));
return 0;
}
这样编译运行,居然毫无问题
顶风尿一身
9 years, 10 months ago
Answers
c99允许长度为零的数组。当然目的不是为了你这样用,而是为了实现柔性数组成员。
比如:
char a ="abc";
int this_length = strlen(a);
struct line {
int length;
char contents[0];
};
struct line *thisline = (struct line *)
malloc (sizeof (struct line) + this_length);
thisline->length = this_length;
之前标准contents必须给至少1个字节,这样会浪费空间,且给malloc的函数参数计算不够简洁。
你这样用,对没有分配的内存进行操作,属于内存非法操作,不过c不管这些的,随你搞。因为小代码,这个操作没有惹到别的进程,以及系统,所有没有爆。就像内存泄露,虽然是错误的做法,倒也不至于立刻引发问题。
参考: http://blog.csdn.net/ce123_zhouwei/article/details/8973073
以前看redis代码,我记得很多地方都这样用。比如redis string就是:
struct sdshdr {
int len;
int free;
char buf[];
};
X-joker
answered 9 years, 10 months ago