2

こんにちは、ユーザーがコマンドラインで入力するグローバル変数の配列サイズで構造体を割り当てようとすると、コンパイルエラーが発生し、グローバルに宣言された変数に値を戻します。

これは単なるサンプルコードです

#include<stdlib.h>
#include<stdio.h>

int Type;

struct list_el {
    int val;
} list1[Type];

struct list_el item;

int main() {
    Type = 10; //just sample
}

エラー

ファイル スコープ構造体 C で変更された変数

とにかく問題を解決する方法はありますか?グローバルに機能する必要があります。

どうもありがとう。

4

4 に答える 4

3

配列を宣言するときは、コンパイル時のサイズの定数が必要ですが、そうでTypeはありません。

実行時に割り当てたい場合は、ポインターとmalloc.


実際には、配列サイズに非定数変数を使用できます。これは可変長配列と呼ばれます。サイズにグローバル変数を使用する際の問題は、グローバル変数がゼロに初期化されることです。そのため、実際には要素がゼロの配列を作成していますがType、配列が作成される前に変数が初期化されている場合に限ります。

于 2013-10-17T08:11:37.130 に答える
2

あなたのコードは無効です:最初に変数をサイズとして使用して配列を宣言してから、変数代入することはできません。

または、可能ですが、配列が魔法のように変更されることはありません。

また、変数と配列がグローバルであることは非常に奇妙です。

おそらく次のようにする必要があります。

int main(void)
{
  int num;

  printf("enter size:\n");
  if(scanf("%d", &num) == 1 && num > 0)
  {
    struct list_el list1[num];

    /* here, work with the array. */
  }
}

このような変数の使用は C99 の機能であることに注意してください。

于 2013-10-17T08:11:49.947 に答える
1

listとそのマグニチュードの両方Typeをグローバルにして動的に割り当てたい場合は、それを行う必要があります: dynamic allocate

#include<stdlib.h>
#include<stdio.h>

int Type;

struct list_el {
    int val;
} *list;

int main() 
{
    Type = 10;

    list = malloc(Type * sizeof(*list));

}

とはいえ、これらがグローバルに必要かどうかを真剣に疑問視してください。コンパイラがサポートしている場合は、ローカル可変長配列 (VLA) を使用できます。これは C99 のオプション機能であり、__STDC_NO_VLA__が定義されていないかどうかを確認することでテストできます。

于 2013-10-17T08:20:19.887 に答える
0

メインで alloca() を使用して、メモリをスタック割り当てできます。

struct list_el {
  int n;
} *list;
static int Type;

int main(int argc, char** argv) {
  Type = argc;
  list = alloca(sizeof(struct list_el) * Type);

  // use list...
}

main() が戻るまで、メモリはスコープ内に留まります。コールバックで何が起こるかわかりませんatexit()。それは興味深い質問です。

于 2013-10-17T17:34:31.867 に答える