2016-04-01 4 views
3

あらかじめ割り当てられたメモリポインタを入力として受け入れ、その位置の構造体の配列をデータで埋め込む関数を作成しようとしています。この例では、出力は次のようになります。関数内に動的に割り当てられた構造体を書き込む

W 100 
L 200 

ただし、最初の行は正しいものの2行目は文字とゼロを出力しません。私は間違って何をしていますか?

typedef struct{ 
    char word; 
    long number; 
}record; 

void makerec(record** data){ 
    data[0]->word='W'; 
    data[0]->number=100; 
    data[1]->word='L'; 
    data[1]->number=200; 
} 

int main(){ 
    record* data=(record*)malloc(sizeof(record)*1000); 
    makerec(&data); 
    printf("%c %ld\n",data[0].word,data[0].number); 
    printf("%c %ld\n",data[1].word,data[1].number); 
    free(data); 
    return 0; 
} 
+0

'data [1]'は範囲外にアクセスします。あなたは '(* data)[1] .word = 'L';などを意味します。 –

答えて

4

あなたは正しいタイプを扱っていません。単に変更:

void makerec(record** data) { 

へ:

void makerec(record * data) { 

と:

makerec(&data); 

へ:

makerec(data); 

同様data[0].word = 'W';

01に data[0]->word='W';や友人の変更など

dataはすでにポインタであり、指し示すものを変更したいので、直接makerecに渡すことができます。 makerec()が別のものを指し示すようにしたい場合はdataへのポインタを渡しますが、これはあなたがここでやっていることではありませんので、dataを渡すだけです。

あなたの主な問題に付随する、しかし:

record* data=(record*)malloc(sizeof(record)*1000); 

は次のようになります。

record* data = malloc(1000 * sizeof *data); 
if (!data) { 
    perror("memory allocation failed"); 
    exit(EXIT_FAILURE); 
} 

注:

  1. あなたは私の心に、(に必要としません。 、しないでください)戻り値をmalloc()と友だちにキャスト

  2. sizeof *datadataのタイプが変更された場合でも機能し続けます。さらに重要なことは、sizeof演算子を間違ったタイプに適用する可能性が排除されることです。これはよくある間違いです。

  3. 1000およびsizeof *dataの位置を逆にすることは、単に複数のことを理解しやすくするために化粧するだけです。

  4. 割り当てが失敗した場合には、戻り値がmalloc()であるかどうかをチェックして、適切な処置(プログラムを終了するなど)を行ってください。

関連する問題