2011-09-17 17 views
3

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

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

答えて

16

structは、コンパイル時に既知の固定サイズでなければなりません。可変長の配列が必要な場合は、メモリを動的に割り当てる必要があります。

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

このようにして、ポインタは構造体にのみ格納されます。それはもう使用されていないとすぐに

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

NULLポインタの戻り値をチェックすることを忘れないでくださいとfree()任意の動的に割り当てられたメモリ:構造体の初期化では、malloc関数で割り当てられたメモリ領域へのポインタを割り当てます。

8
#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); 
} 

この方法で、「可変長配列」を宣言できます。キュー - >値で配列 'values'にアクセスすることができます[index]

EDIT:もちろん、あなたが自由になると、割り当てた 'n * sizeof(int)'を確保する必要があります上記の例ではsizeof(Queue_t)とn = 256です。 HTH

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; 
} 
関連する問題