2012-04-26 14 views
1

別の関数には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()機能上、正常に動作しますが、上記のエラーを取得します。私は完全にこれを修正する方法を失っています。

+1

関数を文字列として出力しようとしていますか?どのように正確に動作するはずですか? – FatalError

+1

computedsizeが小さすぎる可能性があり、割り当てられた領域の最後を上書きしています。 –

+0

sprintfより安全な[snprintf](http://linux.die.net/man/3/snprintf)を使ってみてください。 – Mahesh

答えて

0

ソリューション:

問題、予想通り()宣言があまりにもmalloc()を行う別の関数を呼び出しますが、if()内側と呼ばれる機能は、働いていなかった場合は、実際に、以前malloc()に.Anにあったといくつかの無効な値を格納する。これにより、ヒープの破損が発生しました。

5

割り当てられた配列の範囲を超えて書かれている可能性があります。したがって、ヒープ(malloc/freeというものを管理するメタデータが含まれています)が破損しています。

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

+0

ありがとう。私は今、従うべき方向性を持っています。私はいつか前にvalgrindを試しましたが、それはどんな状況でも私にとってはうまくいかず、アプリケーションは単にクラッシュします。 – Jack

+0

私のアップデートをチェックしてください。 :) – Jack

0

私のために働いていますが、私は計算サイズ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); 
} 
関連する問題