2

asprintfと の両方を使用すると機能しない次のコードがありreallocます。

私が得ているエラーは次のとおりです。

*** glibc detected *** a.out: realloc(): invalid old size: 0x006f1430 ***

私が調査したことに基づいて、使用すると、使用asprintfするメモリを上書きしているように見えreallocます。asprintf安全で、適切な文字列の長さを使用して動的に割り当てる必要があるため、これは私には意味がありません。を使用しないとプログラムは正常に動作しますが、私のプロジェクトasprintfには の機能が必要です。asprintf

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
  int ifCount = 1;
  int stringCount = 1;
  char** IFs = NULL;

  //Broken code
  char* message;
  asprintf(&message, "Hello: %d", stringCount);

  //Working code, but not the alternative I want to take
  //char* message = "Hello";

  IFs = (char**) realloc(IFs, sizeof(char*) * ifCount);
  IFs[ifCount - 1] = (char*) realloc(IFs[ifCount - 1], sizeof(char) * strlen(message));
  strcpy(IFs[ifCount - 1], message);

  printf("Message: %s\n", message);
  printf("Copy: %s\n", IFs[ifCount - 1]);
  free(message);
}
4

2 に答える 2

5

これ:

IFs[ifCount - 1] = (char*) realloc(IFs[ifCount - 1], sizeof(char) * strlen(message));

は、初期化されていないポインタをに渡してrealloc()います。これがエラーの原因です。

また:

  1. 文字列には終了スペースが必要であることに注意してください。上記strlen(message)は1文字が少なすぎるために割り当てられています。これによりstrcpy()、コピー時にバッファオーバーランが発生します。
  2. realloc()ヒープメモリを割り当てるすべての関数と同様に、失敗する可能性があることに注意してください。これは同様ですasprintf()
  3. realloc()の戻り値をCでキャストしないでください
  4. sizeof (char)常に1であるため、コードにほとんど価値を追加しないため、避けてください。
于 2012-11-12T15:20:28.983 に答える
0

または初期化されていない最初の引数で使用reallocする代わりに、最初から使用してください。NULLmalloc

realloc呼び出しで呼び出しが必要な場合はIFs[ifCount - 1] = (char*) realloc(...)、前の行でcalloc代わりに使用します。これにより、割り当てられたメモリが少なくともゼロになり、適切なポインターreallocが与えられます。NULL

于 2012-11-12T15:25:17.440 に答える