1

次のような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()正常に動作します。これを修正する方法が完全に失われています。

4

3 に答える 3

5

おそらく、割り当てられた配列の境界を超えて書き込んだため、ヒープ (物事を管理するために使用するメタmallocデータを含む) が破損しています。free

Valgrind などのツールは、この種のエラーを見つけるのに役立つように設計されています。

于 2012-04-26T18:52:36.403 に答える
0

ソリューション:

実際の問題は、以前のmalloc()if() 宣言で別の関数を呼び出していましたmalloc()が、if()内部で呼び出された関数が期待どおりに機能せず、結果として無効な値がいくつか格納されていました。これがヒープ破損の原因でした。

于 2012-04-26T20:51:17.257 に答える
0

私にとってはうまくいきますが、computedsize foo または baa がありませんでした。おそらく、割り当てたメモリの最後を超えて書き込んだことに同意します。

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

#define COMPUTEDSIZE 1024
void foo(char ** out) {
     *out = malloc(COMPUTEDSIZE);
     if(*out != NULL){
         sprintf(*out, "%s,%s", "foo", "baa");
      }
}
int main(int argc, char * argv[]) {
   char * out = NULL;
   foo(&out);
   printf("%s\n", out); /* so far, it works fine */
   free(out); /* the problem. */ 
   exit(0);
}
于 2012-04-26T18:58:34.057 に答える