別の関数にはmalloc()によって割り当てられた自由()値:できない私はこのような、何か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()
呼び出しは同じエラーを与える。どんな助けもありがとうございます。前もって感謝します。
UPDATE:
私はこの問題は、関数内であることがわかります。 free()
を呼び出すと、無効な次のサイズが発生します。例えば
:
char *f=malloc(2);
strcpy(f,"a");
free(f);
foo()
内部関数は、main()
機能上、正常に動作しますが、上記のエラーを取得します。私は完全にこれを修正する方法を失っています。
関数を文字列として出力しようとしていますか?どのように正確に動作するはずですか? – FatalError
computedsizeが小さすぎる可能性があり、割り当てられた領域の最後を上書きしています。 –
sprintfより安全な[snprintf](http://linux.die.net/man/3/snprintf)を使ってみてください。 – Mahesh