次のようなC関数があります。
void foo(char ** out) {
*out = malloc(computedsize);
if(*out != NULL){
sprintf(*out, "%s,%s", foovar, baa);
}
}
そして、私は呼び出します:
int main(void) {
char * out = NULL;
foo(&out);
printf("%s\n", out); /* so far, it works fine */
free(out); /* the problem. */
}
私が電話するとき:
free(out);
それは与えました:
*** glibc detected *** ./a.out: free(): invalid next size (fast): 0x09a03050 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(+0x6b161)[0x4ff161]
/lib/tls/i686/cmov/libc.so.6(+0x6c9b8)[0x5009b8]
/lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0x503a9d]
./a.out[0x804875b]
./a.out[0x804871a]
./a.out[0x80486f9]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0x4aabd6]
./a.out[0x8048601]
======= Memory map: ========
//メモリマップ部分のコピーが必要?
誰かが私の間違いを指摘できますか? 私はそれが電話だと信じていsprintf()
ます..またはいいえ、実際にはわかりません。関数内に新しい変数を割り当てようとしましたが、それに対して値を割り当てまし*out = myvariable;
た*out = strdup(myvariable)
が、free()
呼び出しで同じエラーが発生しました。
アップデート
問題は関数内にあることがわかります。そのfree()
中の呼び出しは、無効な次のサイズを引き起こします。
例えば:
char *f=malloc(2);
strcpy(f,"a");
free(f);
関数内foo()
では、関数上で上記のエラーが発生し、main()
正常に動作します。これを修正する方法が完全に失われています。