最初に私はC言語ではかなり新しいので、ここでは基本的な誤解があるかもしれません。このようなコードを考える:特定のサイズの文字配列
(gdb) p ack
$1 = "testing\000\360WV\000\000\000\000\000\277\000\000\000\000\000\000
'\000'\000\220\[email protected]",<repeats 13 times>, "\003\[email protected]", '\000' <repeats 13 times>
"\325,\[email protected]\000\000\000\000\000H\214\246\367\377\177\000\000\220\[email protected]",
'\000' <repeats 13 times>, "P\[email protected]\000\000\000\000\000\360\342\377\377"`
これは私がack
を初期化する方法を与えられた私には理にかなって:GDBによって調べたときに
int main()
{
char ack[100];
char *bar;
bar = malloc(100);
strncpy(ack, "testing", 7);
bar = "testing";
return 0;
}
ack
すると、このようになります。
(gdb) p bar
$2 = 0x40066c "testing"
私はack
のためのスペースを要求したとき、私は私が行ったように(私の知る限り)ストレージのと同じ量を割り当てたが、malloc関数がありません:bar
はこのようになりますなぜ私は非常に得ることはありませんことです余分な迷惑。私が理解しているように、mallocはデータの初期化など何もしないので、少し混乱します。これが現れた理由は、私がstrstrで持っていた問題です。基本的に、ファイル(fgets)から特定のサイズのchar配列にデータを読み込むと、strstr()は失敗します(余分な迷惑メールが原因であると仮定していました)。ポインタとmallocされたメモリの作業はうまくいった。とにかく、いくつか具体的な質問があります。
このmallocされた変数の動作は予期されていますか?ここでいくつかの最適化が行われていますか(gccでコンパイルされましたが、最適化はしていませんでした)、gdbはすべてを表示していませんか?その変数に関連する「迷惑メール」が存在するはずですか?
mallocを正しく使用していますか?私が要求したすべてのメモリを初期化する必要がありますか?もしそうなら、どうですか?
ありがとうございます!答えみんなに
EDIT
ありがとう!私はあなたからすべてかなりのことを学びました。そしてそれは大いに感謝しています。上記のコードで問題が発生し、fgets()とstrstr()で問題が発生していました。
メモリは、割り当て時にヌルで埋められません。それを行うにはmemset(..) – Adrian
@Adrian、いいえ、いいえ。これは 'C'です。 'malloc()'をキャストしてはいけません。 'C 'に新しいことを教えてはいけません。 –
@DanFego私はあまりにも私はhahaを推測して学習しています。私はいつもmallocsをキャストしてきました。情報をありがとう。私は私のコメントを編集しました! – Adrian