2012-01-03 25 views
0

構造体へのポインタ配列のためのメモリをmallocで割り当てており、以下のように0で初期化したいとします。構造体にint型とchar [](文字列型)のメンバーが含まれているとしますか?どうすればこの構造体をゼロにすることができますか?構造体へのポインタの配列をゼロに初期化する方法

コード:ゼロで初期化することが必要である理由も私に説明してください、私は100

struct A **a = NULL; 
a = (struct **)malloc(sizeof((*a) * 100); 
for(i=1; i < 100; i++) 
    a[i] = (struct A*)malloc(sizeof(a)); 

のために割り当てたいとします。

プラットフォーム:Linuxでは、プログラミング言語:C

私たちはmemsetのかBZEROを使用することができます知っています。私はそれがクラッシュしていたことを試してみました、私はそれを正しく使っていたので、正しい方法を教えてください。あなただけのa *の一つの要素を作成しているので、しかし、次の行にループがに行くときは、0

大藤に配列全体を設定するmemset()を使用することができます

+0

これはC++が 'malloc'の戻り値のキャストであることを示している唯一のもの。おそらく 'vector'を使うべきです、あるいは' new [] ' –

+2

のCの配列は0で始まります。たとえば、' arr'が配列の場合、 'arr [0]'は配列の最初の要素です。あなたのコード例では、 'a [0]'は決して初期化されません。 – ouah

+0

CまたはC++?一つを選択してください、彼らは異なった言語です。 –

答えて

4

まず、C配列はゼロベースであり、1ベースではありません。次に、1つのポインタを保持するのに十分な領域だけを確保しますが、100個のポインタを格納しています。 100 Aを割り当てようとしていますか、またはそれぞれ100 Aの100個のセットを割り当てようとしていますか?最後に、ループ内のmallocsizeof 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のを必要といけない

0

a = (struct **)malloc(sizeof((a*))); 
for(i=1; i < 100; i++) 
    a[i] = (struct*)malloc(sizeof(a) * 100); 

は、間違っています2回目の反復では、不正なメモリにアクセスします。だから、a *100要素を割り当てるあなたの最初の(エラー処理を含む)

a = (struct **)malloc(sizeof(a *) * 100); 

正しいコードを次のように次のようにmalloc()は、多かれ少なかれになりますでしょう次のようになります。

if ((a = (struct **)malloc(sizeof(a*) * 100)) == NULL) { 
    printf("unable to allocate memory \n"); 
    return -1; 
} 

for(i=0; i<100; i++) { 
    if ((a[i] = (struct*)malloc(sizeof(a) * 100)) == NULL) { 
     printf("unable to allocate memory \n"); 
     return -1; 
    } 
    memset(a[i], 0, 100); 
} 

をまたは代替として、 malloc()memset()を使用できます。calloc()

+0

ああ... sry ..thanks – john

+0

それは1になるとすぐに違法なアクセスを行います。 –

+0

@john私の答えが役に立ったら、upvoteまで気軽にお気軽に!ありがとう! –

6

callocの使用は、上記の例とほとんど同じです。

0

は、1つのcallocは十分です:

int i; 
    struct A **a = calloc(100,sizeof**a+sizeof*a),*mem=a+100; 
    for(i=0;i<100;++i) 
    { 
    a[i]=&mem[i]; 
    } 
    ... 
    free(a); /* and you only need ONE free */ 
関連する問題