【问题标题】:Is it possible to create a struct whose size is not known at compile time?是否可以创建一个在编译时大小未知的结构?
【发布时间】:2013-07-25 18:47:54
【问题描述】:

正如问题所述,我希望在 C 中创建一个结构,我在编译时不知道其总大小。

例如,我想创建一个结构,其中包含一个计数值和一个包含计数元素的数组。我知道这可以实现为:

typedef struct myStruct{
    int count;
    int *myArray;
} myStruct;

但是,我希望这个结构占用一个实心内存块,以便以后可以在其上使用memcpy()。像这样:

typedef struct myStruct{
    int count;
    int myArray[count];
} myStruct;

【问题讨论】:

标签: c memory data-structures


【解决方案1】:

听起来您正在寻找灵活的数组成员:

typedef struct myStruct
{
    int count;
    int myArray[];
} myStruct;

那么,以后分配的时候:

myStruct *x = malloc(sizeof(myStruct) + n * sizeof(int));
x->count = n;

【讨论】:

  • 为什么 malloc 不是(n - 1) * sizeof(int)int myArray[]“大小”不是算在sizeof(myStruct)中吗?
  • @user2246674,不,这就是灵活数组成员的意义。
  • myArray 持有一个指向下一个块的指针,所以当你 memcpy 这个时,你仍然需要更新那个指针。
  • @Magn3s1um,您的说法绝对不正确。 myArray 是一个数组,而不是一个指针。
  • 是的,应该没问题。你也可以用sizeof *x 替换sizeof(myStruct)
【解决方案2】:

是的,你可以。如果您使用 C99,则有 flexible array members。否则,您可以做微软所做的事情。获取您的原始结构定义并将其映射到现有的内存块。将指针重新分配到结构定义之后。

此外,MS 方法将允许多个大小可变的成员;您只需要正确更新每个指针。

(注意:“MS 方法”只是在 Windows API 中经常遇到的东西;我不知道这种做法是否有实际术语。)

【讨论】:

  • 好的,我想我用错了术语...灵活的数组成员?寻找一个体面的链接来解释它...
猜你喜欢
  • 2013-07-07
  • 2018-07-23
  • 1970-01-01
  • 2012-12-15
  • 2021-07-27
  • 2019-07-31
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
相关资源
最近更新 更多