4

プロパティとして配列を使用してデータ型(この場合は構造体)を作成する必要があります。このデータ構造を初期化し、配列に指定されたサイズを与える初期化関数があります。問題は、構造体で配列を宣言することです。たとえば、「int values []」では、角かっこに数値を入力する必要があります(例:values [256])。Th3 256は、構造が初期化されるときに指定する必要があります。これを回避する方法はありますか?

typedef struct 
{
        int values[];      //error here
        int numOfValues;
} Queue;
4

3 に答える 3

17

構造体は、コンパイル時に既知の固定サイズを持っている必要があります。可変長の配列が必要な場合は、メモリを動的に割り当てる必要があります。

typedef struct {
    int *values;
    int numOfValues;
} Queue;

このようにして、ポインタのみを構造体に格納します。構造体の初期化では、malloc で割り当てられたメモリ領域にポインタを割り当てます。

Queue q;
q.numOfValues = 256;
q.values = malloc(256 * sizeof(int));

NULLポインタの戻り値とfree()、動的に割り当てられたメモリが使用されなくなったらすぐにチェックすることを忘れないでください。

于 2011-09-17T08:56:20.357 に答える
9
#include<stdio.h> 
#include<stdlib.h>
typedef struct Queue {
int numOfValues;
int values[0]; 
} Queue_t;

int main(int argc, char **argv) {
Queue_t *queue = malloc(sizeof(Queue_t) + 256*sizeof(int));
return (1);
}

このようにして、「可変長配列」を宣言できます。そして、queue->values[index]を使用して配列の「値」にアクセスできます。

編集:もちろん、解放したら、上記の例のHTHでn = 256であるsizeof(Queue_t)とともに割り当てた「n * sizeof(int)」を考慮に入れる必要があります。

于 2011-09-17T10:39:11.827 に答える
3

VLAなどのC99機能を使用できます。

int main()
{
  int len=1234;
  struct MyStruct {int i,array[len];} var;

  var.array[0]=-1;
  var.array[len-1]=1;

  printf( "%i %i %lu", var.array[0],var.array[len-1],(unsigned long)sizeof(var) );

  return 0;
}
于 2011-09-17T11:49:10.527 に答える