2017-02-16 20 views
1

これは学校のC課題ですが、私はそれが正常かどうかわからないという奇妙なことにぶつかっています。は、Mallocがより多くのメモリを割り当てる必要がありますか?

は、私は、コマンドライン引数を取らなければならないと1の例では、malloc

char *fileName = NULL; 
fileName = malloc(strlen(argv[i]) * sizeof(char)); 
//error testing etc 
strcpy(fileName, argv[i]); 

ので、私のプログラムの中に私が動的に割り当てるメモリ

-ia.bですうまく動作しますが、私はビジュアルスタジオデバッガを介してメモリを調べます。これはメモリ位置に割り当てられるものです。必要に応じて:

0x01608b98 "ÍÍÍÍÍýýýýB`\x1˜?`\x1\xf1¼O{º" 

私は、そのようなので、fileName = (char*)malloc(strlen(argv[i]) * sizeof(char));としてmalloc関数をキャストした場合、私は、このメモリに割り当てられます:

0x009d8d38 "ÍÍÍÍÍýýýýB" 

私の引数が5バイトであることを考慮すると、malloc関数は、より多くのメモリを割り当てて、それがすべきかだ私はこれを間違って行うだけですか?

+2

あなたが求めている以上に多くを割り当てます。しかし、私はどのくらい割り当てられているかをどのように決定するかについては明確ではありません。 –

+0

はい、malloc実装では、内部使用を要求するよりも多くのメモリを割り当てることがよくあります。 – d3L

+3

おそらく。しかし、** strlen(argv [i]) 'は'(strlen(argv [i])+ 1) 'にする必要があるため、割り当てられたメモリが正確でない不足**からあなたを保護しませんそれに続く 'strcpy'のターミネータ。 –

答えて

3

通常、mallocは、16バイトに等しい段落サイズで正確に割り切れるチャンクでメモリを割り当てます(つまり、mallocは基本的な配置要件でチャンクを割り当てます)。しかし、mallocのこの内部的な振る舞いに頼るべきではありません。それ以外の場合、動作は未定義です。

+1

"段落サイズ"。あなたはまだDOSを多用していますか? ;) –

+0

@DanielKamilKozar現代的なOSでメモリの最小サイズがmallocによって割り当てられているかどうかは確認しませんでした。 –

関連する問題