簡體   English   中英

如何在C中使用動態大小的數組創建結構

[英]How to create struct with dynamically sized array in it in C

由於我有一個結構這樣

struct arr {
  int len;
  void *item[]; // still playing with this
};

typedef struct arr my_array;

我想知道你是如何初始化它的。

my_array foo = { 0, 1000 }; // 1000 spaces reserved.
// or perhaps...
my_array foo = { 0, [1000] };

因為當你有一個常規數組時,你指定這樣的大小:

int anarray[1000];

所以我想你可以這樣做來初始化上面數組結構中的指針值。

甚至會

foo->item[1000];

我不知道。 想知道是否有可能這樣的事情。

靈活的數組成員僅在動態分配結構時才真正有用。 如果靜態或自動分配結構(即在堆棧上),則分配的內存量為sizeof(struct arr) ,該值由item 0個成員計算。 沒有語法來定義變量,其類型是具有靈活數組成員的結構,並指定該數組的大小。

因此,如果您在堆棧上分配此結構,那就是它的全部內容:

struct my_array foo = { 0 };

要將元素放入靈活數組中,您需要動態分配內存。

struct my_array *foo = malloc(sizeof(*foo) + 1000 * sizeof(foo->item[0]));

如果希望數組具有分配給它的任何空間,則需要動態分配具有靈活數組成員的 struct類型:

struct arr *foo = malloc( sizeof *foo + (sizeof foo->item[0] * 1000) );
if ( foo )
{
  foo->len = 1000;
  for ( int i = 0; i < foo->len; i++ )
    foo->item[i] = some_value();
}
...
free( foo );

假設您希望item flexible-array成員包含m指針,

struct arr *p = malloc(sizeof (struct arr) + sizeof ((void*)[m])); 

這將表現為您將結構定義為

struct arr {
  int len;
  void *item[m];
};

聲明它不完整,它允許您在運行時選擇數組的大小。

6.7.2.1 Structure and union specifiers ,p16:

作為一種特殊情況,具有多個命名成員的結構的最后一個元素可能具有不完整的數組類型; 這被稱為靈活的陣列成員。 .......如果這個數組沒有元素,它的行為就像ifit有一個元素但是如果任何嘗試訪問該元素或者生成一個超過它的指針,則行為是未定義的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM