すべての引数を連結されたchar配列として返す関数を作成しようとしています。残念ながら、関数の使用中に「無効なポインタ」エラーが発生します。私はC言語に新しいので、おそらく私はこのようにreallocを使うのが間違っています。forループのRealloc
char* concat(int argc, ...) {
char* result;
va_list args;
va_start(args, argc);
int i;
for (i = 0; i < argc; i++) {
char* s = va_arg(args, char*);
int length = (result) ? strlen(result) : 1;
char* tmp = (char*)realloc(result, sizeof(char) * (strlen(s) + length - 1));
if (tmp == NULL) {
throw_error("Realloc failed in `concat`.");
}
result = tmp;
memcpy(&(result[length-1]), s, strlen(s));
printf("result: %s\n", s);
}
va_end(args);
return result;
}
エラーメッセージ、それは助けることができる場合:
result = (char*)realloc(result, sizeof(char) * (strlen(s) + length - 1));
:
*** glibc detected *** ./pascc: realloc(): invalid pointer: 0x00000000006060c8 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x76bb6)[0x7f9953be8bb6]
/lib/x86_64-linux-gnu/libc.so.6(realloc+0x338)[0x7f9953beed58]
./pascc[0x401368]
./pascc[0x400f85]
./pascc[0x4019bb]
./pascc[0x403c49]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xff)[0x7f9953b90eff]
./pascc[0x400e29]
======= Memory map: ========
00400000-00406000 r-xp 00000000 08:05 2885504
をメモリリークを避けるために、私はこのような何か自分自身をREALLOCべきではないと、他のスレッドで読みます
私はこれを行う良い方法を見つけようとしています。助けていただければ幸いです。
gccのオプション '-Wall -O3'は、"結果はこの関数で初期化されずに使用されるかもしれません "と伝えます。そして、私はvalgrindもあなたに「条件付きの価値は初期化されていない価値に依存する」のようなものを教えてくれると確信しています。 –