【问题标题】:Defined an empty array in c在c中定义了一个空数组
【发布时间】:2016-08-25 08:39:10
【问题描述】:

在下面的程序中实际发生了什么,我在代码和 GCC 编译器中定义了一个空数组 int arr[];,但编译器没有给出错误。成功了。

#include <stdio.h>
#include <stdlib.h>

typedef struct st
{
        int i;
        int arr[];
}ST,*ptr;

int main()
{
        ST s1;
        ptr p1= (ptr)malloc(sizeof(ST)+4*sizeof(int));

        p1->i=10;
        p1->arr[0]=1;
        p1->arr[3] = 1;

        printf("%d\n",p1->arr[3]);
        printf("%ld\n", sizeof(s1));
}

C 语言不允许未定义的数组长度。但 GCC 编译器 允许。为什么?

只是好奇,到底发生了什么?

【问题讨论】:

  • C 标准允许这样做。搜索“灵活数组成员”。
  • Flexible array member,有两个建议:不要投射malloc,不要用typedefs隐藏指针
  • 作为结构体的最后一个成员,在结构体存储可变数据量的情况下很有用。
  • @AlterMann 谢谢先生,我不知道这个话题..
  • 这是一个C99 feature;在过时的 C 编译器(尤其是 Microsoft Visual Studio 的某些版本)中不可用。

标签: c arrays gcc


【解决方案1】:

C99 起有效且允许。它被称为flexible array member - 用于使结构的最后一个成员变长并且如果使用它必须是结构的最后一个成员。

【讨论】:

    【解决方案2】:

    您正在查看 C99 功能,Flexible array member。如果数组是在结构的末尾定义的,那么您将在分配期间通过 malloc 定义其大小,通过分配更大的内存块。

    对于大小为len的数组:

    struct st *mySt = malloc(sizeof(struct st) + len * sizeof(mySt->arr[0]));
    

    【讨论】:

      【解决方案3】:

      C99,最后一个元素的结构允许数组的大小是未知的,这叫做灵活的数组成员,但是前面的结构是一个灵活数组成员必须至少有一个其他成员。

      灵活的数组成员允许构造包含可变大小的数组。 sizeof 返回的结构大小不包括灵活的内存数组。包含使用malloc () 函数的灵活数组成员的结构会动态分配内存,并且分配的内存应大于结构的大小以适应灵活数组的预期大小。

      基本模型

      typedef struct st
      {
              int i;
              int arr[];
      }ST,*ptr;
      

      在linux下测试gcc关于结构体的运行结果,数组的最后一个元素,和一个未定义长度的数组,运行结果与理论一致,这有点像c++类的成员函数,成员函数不是占用类空间大小。嗯,这个灵活的数组,有什么作用呢。

      【讨论】:

        猜你喜欢
        • 2015-02-11
        • 2018-11-01
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 2011-10-17
        • 1970-01-01
        • 1970-01-01
        • 2016-02-17
        相关资源
        最近更新 更多