一维数组不初始化长度编译器为什么没有警告?



 #include <stdio.h>
#include <string.h>
int main()
{
    char a[]={};
    scanf("%s",a);
    printf("%lu",strlen(a));
    return 0;
}

这样编译运行,居然毫无问题

c 数组

顶风尿一身 9 years, 10 months ago

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[];
};

https://github.com/antirez/sds/blob/master/sds.h

X-joker answered 9 years, 10 months ago

Your Answer