Realloc x86 x86_64

私には機能があります

void *srealloc(void * ptr , int size){
    void *tmp = realloc(ptr , size);
    if(tmp == NULL){
        fprintf(stderr,"realloc of %u bytes failed", size);
        exit(1);
    }
    return tmp;
}

これを呼び出す私のコードはx86コンピュータで正常に動作しますが、x64コンピュータで同じコードをコンパイルして実行すると、segfaultが発生します。

これがどのように呼び出されているかの例は次のとおりです。

line = "Some string";
buffer = (char**) srealloc (buffer,sizeof(buffer)*(++buffer_lines));
buffer[buffer_lines-1] = line;

segfaultingコンピュータでsreallocが呼び出されたときにgdbをトレースすると ptr == 0x0、サイズ== 8

*編集:  segfaultは次の場所で発生します。

void *tmp = realloc(ptr, size);
3
buffer はどのように宣言されていますか?
追加された 著者 zneak,
sizeof(buffer)は、 charへのポインタへのポインタのサイズです。正しいようにするには、 sizeof(char *)を使用する必要があります。 1つの型へのポインタのサイズが別の型へのポインタと同じで、これを指摘したかっただけなので、ここでは重要ではありません。
追加された 著者 Some programmer dude,
恐らくあなたのクラッシュとは無関係ですが、関数のシグネチャも間違っているので、 realloc と同じでなければなりません。 int が "sizes"の正しいタイプでない場合、このような目的では決して符号付きタイプを使用しないでください。特に、現代の64ビットアーキテクチャでは、 int は通常32ビットで、 size_t は64です。このような目的で設計された size_t を使用します。
追加された 著者 Jens Gustedt,
行はchar *
追加された 著者 LeeG,
bufferはグローバル変数です: char ** buffer = NULL;
追加された 著者 LeeG,
@JoachimPileborg良い点、私はそれのような私のコードを元々持っていたが、それは欲求不満から一点で変わった。
追加された 著者 LeeG,

2 答え

あなたの電話は大丈夫です。 realloc() calloc()または free()のクラッシュはしばしば症状ですプログラム内の他の場所にあるバグのうち、割り当てられたブロックの境界を越えて記述し、メモリ割り当て関数によって使用されているハウスキーピング情報を踏ん張りました。

ValgrindやPurifyのようなツールの下でプログラムを実行してみてください。

3
追加された
Valgrindを実行した後、 cp * が初期化されていないときに strncpy(cp、line、strlen(line)+1)私はこれが後で私がreallocと呼んでいたときにぶつかっていくと思います。 Valgrindは良い呼び出しでした。
追加された 著者 LeeG,

realloc を呼び出すコードに、その関数の有効なプロトタイプがあることを確認します(つまり、 stdlib.h を含める)。

32ビットから64ビットへの切り替えの多くの問題には、整数(プロトタイプがない場合のデフォルトの引数)とポインタの間の不一致が含まれます。整数は64ビットプラットフォーム上では32ビットにとどまるが、ポインタのサイズは大きくなる可能性がある。

あなたはポインタがNULLであり、要求されたサイズが8であると述べているので、それは確かに関数の有効な使用です。ヌルポインタのreallocは事実上mallocと同じです。だからこそ私はプロトタイプ問題を疑う。

また、新しいマシンのすべてをコンパイルしていることを確認してください。 32ビットコンパイルされた srealloc を64ビットコンパイルされたクライアントにリンクしようとすると、問題が発生する可能性があります。

0
追加された
Valgrindを実行した後、 strncpy()へのガベージ・ポインタの送信がヒープを台無しにしていたことが判明しました。これは私のコードがx86コンピュータ上で動作していた理由を説明していませんが、とにかく私はこのバグの原因を見つけてうれしいです。
追加された 著者 LeeG,