2012-01-22 16 views
1

こんにちは私はこの状況に走りました。私は10個のポインタの配列を私に与えるためにmallocを使用しています。 gdbでテストポインタを見ると、そのうちの1つ(3番目)が0x0を指しています。場合によっては、apple [2] - > string = "hello"を使用すると、コードがsegfaultになることがあります。なぜmallocはこれをしますか?助けを前にありがとう。nullポインタを初期化するMalloc

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


int 
main(void) 
{ 
    typedef struct test 
    { 
     char *string; 
     int data; 
    } test; 

    test *apple[10]; // Declare an array of 10 test pointers. This line results in one of the pointers having a null value. 
    apple[0] = malloc(sizeof(test)); 
    apple[0]->string = "hello"; 

    printf("The string is %s\n",apple[0]->string); 
    printf("Size of apple[0]->data is %d\n",sizeof(apple[0]->data)); 
    printf("Size of tester is %d\n",sizeof(test)); 
    free(apple[0]); 
    return 0; 

} 

ポインタの配列がどのように機能するかを見たいと思っていました。私はすべての10のポインタを使用するつもりはなかった。私は必要なものだけをmallocする必要がありますか? 3番目のポインタが0x0だったのは偶然でしょうか?

答えて

4

メモリはappleの最初の要素にのみ割り当てられているため、有効なstruct testを指しているのはapple[0]です。 appleのすべての要素のためにメモリを割り当てる

free()に必要

for (int i = 0; i < sizeof(apple)/sizeof(test*); i++) 
{ 
    apple[i] = malloc(sizeof(test)); 
} 

同様ループ。

test.stringchar*です。文字列リテラルを指していても問題ありません(ただし、タイプはconst char*である必要があります)。文字列をtest.stringにコピーする場合は、コピーする領域がmalloc()、コピー先がfree()である必要があります。

+0

はい、初期化されていない:あなたはapple[0]、またはのmalloc()配列全体で行ったように(今は本当に必要ではないポインタで、)アプローチ、あなたは()(malloc関数を独自にすべての要素を持っていますメモリは任意の値を保持できます。必要なのは 'malloc()'だけですが、モールの内容を知る方法が必要です例えば、 'test * apple [10] = {0};'のように、すべてのunmallocの要素を 'NULL 'に設定します。 – hmjd

1

あなたはtestのだけインスタンスを割り当てていると、あなたが最初の配列要素に割り当てている:

apple[0] = malloc(sizeof(test)); 

あなたがしたいすべての10を、割り当てるには:

for (int i = 0; i < 10; i++) { 
    apple[i] = malloc(sizeof(test)); 
} 
2

あなたの最終目標が何であるかによって、さまざまなアプローチがあります。

あなたの配列の要素数は、プログラムが実行されるたびに一定になるように意図されている場合は、あなたがすべてでポインタを使用する必要はありません。

test apple[10]; // array with 10 instances of test 

test[0].string = ...; 
test[1].data = ...; 

あなたを使用したい場合

int num = 10; 
test *apple = malloc(sizeof(test) * num); 

// access any element here 
apple[5].string = "hello!"; 

free(apple);