2016-12-14 5 views
-2

私は** lineという名前のポインタ配列を持っています。各行の長さは100文字です。なぜreallocは2つの異なるポインタを作成しますか?

そして、任意の行に文字を追加し、それが十分な大きさでなければラインを再割り当て機能を持っている:

void add_letter(char *line, int pos, char letter) { 
    if(strlen(line) % 100 == 0){ 
     line = realloc(line, sizeof(char) * strlen(line) + 100); 
    } 
    ... 

add_letterは、このように呼ばれている。ここで

add_letter(lines[0], pos, ch); 

ラインに等しいですlines[0]となり、2行目では、p line == lines[0]の場合、gdbは1を返します。 ここでlinelines[0]は両方ともメモリロケーション0x6465e0にあります。

しかしrealloc呼び出した後、line0x648200になりますが、同じでlines[0]滞在と""空の文字列になります。

reallocはこのように動作する原因は何ですか?この理由により、最後の結果であるstrcat(line, newline),newlineは機能終了時に機能しません。

+1

に役立ちます「何がこのように行動する 'realloc'の原因は?」ええと...それはまさに 'realloc'のやり方です!それが 'realloc'の目的です。一般的には、* new *メモリ位置に* new *メモリブロックを割り当てます。それ以外のどのように行動すると思いましたか? – AnT

+0

私はCを使用していません。C++ではありません。 – razorx

+0

@AnTしかし、それは行[0]を変更せずに行を変更しますが、それらは同じことです。 – razorx

答えて

3

あなたがここに間違っている:ここで

linelines[0]は、メモリ位置0x6465e0の両方です。

両方の変数が0x6465e0を持っていますが、彼らは別の場所にあります。 realloclineと呼び出すと、ランタイムはlineが指すメモリ(0x6465e0)の割り当てを解除し、新しいメモリを割り当てて、そのアドレスをline - つまり0x648200に設定します。 lines[0]はこの操作の影響を受けませんが、指しているメモリはすでに解放されています。 ボトムライン - あなたが再割り当て場合は、新しい場所に古い場所を指摘しすべてポインタを更新する必要が

希望は、これが

関連する問題