2012-01-22 8 views
0

mallocを使用したメモリ割り当てに問題があります。ここ は私のコードからの断片である:malloc関数がクラッシュする

printf("DEBUG %d\n",L); 
    char *s=(char*)malloc(L+2); 
    if(s==0) 
    { 
     printf("DEBUGO1"); 
    } 
    printf("DEBUGO2\n"); 

それは「DEBUG 3」を出力し、その後、エラーメッセージボックスがこのメッセージが表示されます:

「0x0000000」で0x7c9369aa参照メモリでの命令。 メモリを読み取れませんでした

私にとっては、このような動作は非常に奇妙です。 ここで何が間違っていますか?

アプリケーションはシングルスレッドです。

私はコードで構築されたのMinGWのCコンパイラを使用しています::ブロック10.05

場合、必要に応じて、私はすべてのコードを提供することができます。おかげさまで

UPD1: は、より多くのコードがある:

char *concat3(char *str1,char *str2,char *str3) 
{ 
    /*concatenate three strings and frees the memory allocated for substrings before*/ 
    /* returns a pointer to the new string*/ 

    int L=strlen(str1)+strlen(str2)+strlen(str3); 
    printf("DEBUG %d\n",L); 
    char *s=(char*)malloc(L+2); 
    if(s==0) 
    { 
     printf("DEBUGO1"); 
    } 
    printf("DEBUGO2\n"); 
    sprintf(s,"%s%s%s",str1,str2,str3); 
    free(str1); 
    free(str2); 
    free(str3); 
    return s; 
} 

UPD2: それは問題は、私が思ったよりも複雑であるようです。誰かが持っているだけであれば私を助けるために十分な時間:

をここでは、すべてのコード

Proj

(それがコード::ブロック10.05プロジェクトですが、あなたは、IDEなしでそれをソースをコンパイルしています として

呼び出しプログラム「cbproj.exe s.pl」(s.plファイルがarhiveのルートにある)

は、あなたはときにクラッシュ表示されることがあります。純粋なC)は、任意のライブラリなしですそれはfunctiを呼び出す"parser.tab.c"(関数concat3が書かれている)の113行目にある "malloc"上にある。

私は教育的な目的でプロジェクトを行っていますが、あなたは何の制限もなくソースコードを使用することができます。

UPD3: 問題は、それがプログラム内の文字列のいずれかのために十分でないメモリを割り当てられていたということでしたが、次のmallocまで動作するように見えた...ああ、私は今Cを嫌い:) を私は同意します悪いコーディングスタイルに関するコメントで、これを改善する必要があります。

+0

コードは不完全です。 'L'とは何ですか? –

+4

エラーは他の場所です。関連するコードを投稿してください。 –

+0

0の代わりにNULLと比較する必要があります – BlackBear

答えて

1

この正確なコードの問題はmallocが失敗したとき、あなたは関数から戻るが、バッファとしてsprintfコールでさらにこのNULLポインタを使用しないことです。

また、私は、この関数の外str1str2str3に割り当てられたメモリを解放するためにあなたをお勧めしたい、または他のあなたはどこか別のトラブルに自分を置くかもしれません。


EDIT:valgrindの下に、あなたのプログラムを実行した後、(parser.tab.cに)明らかにした2つの本当問題:yyuserAction

char *applR=(char*)malloc(strlen(ruleName)+7); 
sprintf(applR,"appl(%s).",ruleName); 

+7が不十分です文字列の最後に\ 0 charのスペースも必要なのでそれを+8にすることが助けになりました。 SplitList

char *curstr=(char*)malloc(leng); 

ゼロバイトを割り当てる可能性があります。 leng + 1が役立ちます。

上記の変更の後、すべてがうまく動作します(メモリリークをカウントしないため、すべてがうまく動作します)。

+0

ありがとう、applRの最初の問題は実際の問題でした。それを固定した後、すべて正常に動作します。あなたはまた、メモリリークについては正しいです、私はそれらのすべてを修正するためにいくつかのツール(valgrindのような?)を学ぶ必要があります。 –

1

エラーメッセージから実際にはあなたのifのステートメントはあなたがここに投稿したものではありません。

if(s=0) { 
} 

ノート代わりに==(平等)の単一=(割り当て):それはあなたのif文はこのようなものであるかもしれないことを示唆しています。

+0

はい、唯一可能な答えのようですが、 –

0

malloc,callocまたはreallocで作成されていないポインタに対してfreeを使用することはできません。 The Manページから:

free()は、以前のmalloc()、calloc()またはrealloc()の呼び出しによって返された必要があるptrが指し示すメモリスペースを解放します。それ以外の場合、またはfree(ptr)がすでに呼び出されている場合は、未定義の動作が発生します。 ptrがNULLの場合、操作は実行されません。

+0

ありがとうございましたが、私はstrdupによって作成されたポインタに "free"を使用していますが、メモリを割り当てるためにmallocを使用しています –

関連する問題