2

関数内に構造体配列を作成する方法を知っています。

typedef struct item
{
    int test;
};

void func (void) 
{
    int arraysize = 5;
    item ar[arraysize];  
}

しかし、配列がグローバルに宣言されている場合、どうすれば同じことができますか?

typedef struct item 
{
    int test; 
};

item ar[];

void func (void)
{
    int arraysize = 5;
    // What to here?
}
4

5 に答える 5

3

可変長配列は、自動保存期間のある配列のCでのみ許可されます。ファイルスコープで宣言された配列には静的ストレージ期間があるため、可変長配列にすることはできません。

を使用mallocして、コンパイル時にサイズが不明な配列オブジェクトにメモリを動的に割り当てることができます。

于 2013-01-12T17:19:54.200 に答える
2
item * ar:
int count;

void foo()
{
    count = 5;
    ar = malloc(sizeof(item) * count);
    // check to make sure it is not null...
}
于 2013-01-12T17:22:49.313 に答える
1

あなたはこのようになるかもしれません:

typedef struct item 
{
    int test; 
};

item *arr;

void func (void)
{
    int arraysize = 5;
    arr = calloc(arraysize,sizeof(item)); 
     // check if arr!=NULL : allocation fail!
     // do your work 

    free(arr);
}

しかし、その動的な割り当て!

そしてarraysize 、コンパイル時にわかっている場合。次に、次のようなマクロを作成することをお勧めします。

#define arraysize  5

typedef struct item 
{
    int test; 
};

item arr[arraysize];  

マクロ定数に大文字を使用することは良い習慣です。

于 2013-01-12T17:21:01.217 に答える
1
typedef struct item 
{
    int test; 
};

#define ARRAYSIZE 5

item ar[ARRAYSIZE];
于 2013-01-12T17:25:08.517 に答える
0

実行時に配列のサイズを変更することはできません。動的メモリ割り当てを実行し、realloc()必要に応じて呼び出すことができます。

編集:あなたの場合、私はこのような何かをすることをお勧めします:

item *ar;

    void func(void)
    {
      int arraysize = 5;
      ar = malloc(arsize);
      if(ar) {
      /* do something */
     }
     //don't forget to free(ar) when no longer needed
    }
于 2013-01-12T17:18:59.200 に答える