2011-12-14 12 views
1

は、私はこのような構造体を作った:malloc関数、構造体

struct a{ 
    char *name; 
    char *value; 
    struct a *next; 
}; 

私が初めてで、メモリのためをmalloc、それは大丈夫だ、と私は「名前」と「価値」に対応する値を設定することができます。 しかし、2回目のmallocのときにエラーが発生します。そしてそれはCGIです、私には "500 Internal server error"と表示されます。

ポインタ 'name'と 'value'を配列に変更しても、すべて動作します。

私は、どのくらいのメモリを割り当てるべきか分からないと思っていました。

あなたはこれについていくつか考えていますか?私はすべての答えを感謝します!

+5

あなたは 'a-> name'や' a-> value'の値に直接格納したのか、_them_のためにメモリを割り当てたのでしょうか? – sarnold

+0

メモリを割り当てずに値を直接格納します。 Keith Thompsonがコメントしたように、私はa nameとa valueのためにメモリを割り当てますが、それは機能します。違いを知っていますか?ありがとうございました! – trinity

答えて

2

mallocsizeof(struct a)と使用すると、ポインタの名前と値を格納するのに十分な領域を割り当てるだけです。これらをchar配列にしたい場合は、aのインスタンスごとにどれくらいのスペースを確保するかを知ることになります。

+0

ありがとう、LaceySnr。あなたは私よりも良い理解を得る。それは私には明らかです。 – trinity

3
struct a { 
    char *name; 
    char *value; 
    struct a *next; 
}; 

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

上記は、単一struct aのオブジェクトのための領域を割り当てますが、それはstruct aに含まれているHTEのいずれかの3つのポインタを初期化しません。あなたは、文字列を指すようにnamevalueをしたい場合は特に、あなたはこれらの文字列のためのスペースを割り当てる必要があります:

head->name = malloc(5); 
strcpy(head->name, "Fred"); 
head->value = malloc(8); 
strcpy(head->value, "abcdefg"; 

これはかなり単純化されます。 58は「マジックナンバー」です。初期値を変更した場合、一貫性のある方法でサイズを指定する必要があります。 常には、エラーメッセージでプログラムを終了しても、NULLポインタを返すかどうかを確認する必要があります。

あなたが割り当てられたメモリの一部のチャンクを指すようにnamevalueを初期化していない場合は、あなたかもしれないはまだ彼らは(例えば、mallocのことなく、上記strcpy Sを行うことによって)を指すものを初期化することができます。より正確には、システムは必ずしもエラーを診断するとは限りません。

最後に、malloc()コールに対応するfree()へのコールが必要です。

これは主にあなたの説明に基づいて推測されることに注意してください。実際のコードを表示することができれば、より良いお手伝いをすることができます。

+0

ええ、あなたは正しいです。私はあなたの方法をテストしました。できます。しかしもう1つの疑問は、 'head-> name = malloc(5)'を使うときには、mallocしたいサイズを知る必要があります。プロセスは次のようになります。長さをcacluateし、次にmallocを指定します。私はそれが効率だとは思わない。ありがとうございました! – trinity

+0

長さの計算方法は、データがどこから来ているかによって異なります。名前として使用する文字列を指す 'name'という' char * 'ポインタがある場合、' head-> name = malloc(strlen(name)+ 1);を実行できます。 if(head-> name == NULL){/ *割り当ての失敗を処理する* /} strcpy(head-> name、name); '。例えば。( '+ 1'は、文字列を終了する ''\ 0"ヌル文字を保持するために必要です。) –

+0

ここでは、 "search = stackoverflow&keyword = malloc&language = en&else = null"のようなqeury文字列を解析します。私はこれを行うための効率的な方法を見つけることができません。 – trinity

関連する問題