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

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

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

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


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的函数参数计算不够简洁。

以前看redis代码,我记得很多地方都这样用。

你这样用,对没有分配的内存进行操作,属于内存非法操作,不过c不管这些的,随你搞。因为小代码,这个操作没有惹到别的进程,以及系统,所有没有爆。就像内存泄露,虽然是错误的做法,倒也不至于立刻引发问题。

【热门文章】
【热门文章】