まず、C
配列はゼロベースであり、1ベースではありません。次に、1つのポインタを保持するのに十分な領域だけを確保しますが、100個のポインタを格納しています。 100 A
を割り当てようとしていますか、またはそれぞれ100 A
の100個のセットを割り当てようとしていますか?最後に、ループ内のmalloc
がsizeof a
のスペースを割り当てます。sizeof (struct A)
ではなくスペースを割り当てます。
A
に100個のポインタの配列を割り当てようとしており、各ポインタが単一のA
を指しているとします。
ソリューション:あなたはcalloc
を使用することができます。
struct A **a;
/* In C, never cast malloc(). In C++, always cast malloc() */
a = malloc(100 * sizeof((*a)));
for(i=0; i < 100; i++)
a[i] = calloc(1, sizeof(struct A));
それとも、あなたがmemset
を使用することができます。
struct A **a;
a = malloc(100 * sizeof(*a));
for(i = 0; i < 100; i++) {
a[i] = malloc(sizeof(struct A));
memset(a[i], 0, sizeof(struct A));
}
あなたは "なぜそれがゼロに初期化する必要がある?" 尋ねますそうではありません。これに関連する要件は次のとおりです。最初に変数を使用する前に、変数に値を割り当てたり、変数を初期化したりする必要があります。その割り当てまたは初期化はゼロかもしれないし、
47
かもしれないし、
"John Smith, Esq"
かもしれない。それはちょうど
一部有効な割り当てである必要があります。
は、利便性の問題として、あなたは1回の操作(memset
またはcalloc
)で行うことができ、ゼロにstruct A
のあなたのメンバーのすべてを初期化することを選択するかもしれません。ゼロはあなたのために有益な初期値でない場合は、例えば、手で構造体のメンバを初期化することができます:あなたは決して初期化されていないと、割り当てられていない変数の値を参照しないよう
struct A **a;
a = malloc(100 * sizeof(*a));
for(i = 0; i < 100; i++) {
a[i] = malloc(sizeof(struct A));
a[i]->index = i;
a[i]->small_prime = 7;
strcpy(a[i]->name, name_database[i]);
}
限り、あなたは良いです。あなたは多くのmallocのを必要といけない
これはC++が 'malloc'の戻り値のキャストであることを示している唯一のもの。おそらく 'vector'を使うべきです、あるいは' new [] ' –
のCの配列は0で始まります。たとえば、' arr'が配列の場合、 'arr [0]'は配列の最初の要素です。あなたのコード例では、 'a [0]'は決して初期化されません。 – ouah
CまたはC++?一つを選択してください、彼らは異なった言語です。 –