2016-09-08 5 views
-1

私は持っているCコードのビットで問題を見つけることを試みています。デバッガは、私は、ポインタからMEMを解放しようとすると、エラーが発生したことを言う:セグメンテーションフォールトfree()in cを使用

int main(int argc, char *argv[]){ 
    char *desc = malloc(30 * sizeof(char)); 
    if(desc == NULL)      
    { 
     fprintf(stderr, "Error - cannot allocate memory\n"); 
    } 
    desc = "Debug this program."; 
    printf("Description: %s\n", desc); 
    free(desc);//break point here 
    int cpid = fork(); 
    .... 
+1

リテラル文字列のアドレスを解放しようとしていますが、これは不正です。 – LPs

+2

さらに、文字列リテラルから割り当てられたポインタを割り当てることは、ほとんど常に間違っています。リテラルを 'desc'にコピーしたい場合は' strcpy'を使います。 – Actorclavilis

+0

'sizeof(char)'は常に1であることに注意してください。これはオブジェクトサイズの単位です。 –

答えて

6

あなたはdescを再割り当てして、リテラル文字列へのポインタを解放し、それは違法だし、それがセグメンテーションフォールトが発生します。

malloc()がわかりません。malloc()は、OSからメモリを要求し、プログラムで使用できる有効なメモリへのポインタを返します。

malloc()の後、メモリを使用することはできますが、すべてのポインタが私に必要ですmalloc() ed。たとえば、文字列リテラルへのポインタを持つことができ、それらも便利です。

malloc()/calloc()/realloc()が返された場合を除き、free()には何も渡すことはできません。文字列リテラルへのポインタまたは変数のアドレスを保持するポインタはそのようなポインタではなく、free()に渡すことは未定義の動作です。

malloc()を使用するのは、スタックをオーバーフローさせるメモリを大量に割り当てるか、実行時に計算できる未知のメモリを割り当てるなどの必要があることがわかっている場合のみです。さもなければ、そうしないでください。

+0

ありがとうございました!それは本当にそれをクリアし、事を説明します。私はOSコースに入っており、本当に誠実に私を混乱させています。 – MaddieSun

1

リテラル文字列のアドレスを解放しようとしていますが、これは不正です。

リテラル文字列を使用してated文字列を初期化するには、たとえば次のようにします。 strcpy

strcpy(desc, "Debug this program."); 

また、出口/ malloc失敗した場合には、あなたのプログラムを終了する必要があります。

+0

ありがとうございました!!!私は後で私のプログラムを終了する(私は....子プロセスと私の出口()呼び出しを置く) – MaddieSun

3

最初に、あなたはメモリとそのアドレスがdesc

char *desc = malloc(30 * sizeof(char)); 

ポインタに割り当てられて動的に割り当てられた後、あなたはこのように"Debug this program."

desc = "Debug this program."; 

リテラル文字列の最初の文字のアドレスを使用してポインタを再割り当て割り当てられたメモリのアドレスが失われました。

その後、あなたは文字列リテラルは、静的記憶域期間を持つ標準機能freeを使用して解放することはできませんがリテラル

free(desc);//break point here 

文字列によって占有されていたメモリを解放しようとしています。代わりに、この代入文の

desc = "Debug this program."; 

あなたは

strcpy(desc, "Debug this program."); 
+0

ありがとう! (: – MaddieSun

+0

@MaddieSunいいえ、あなたは大歓迎です:) –

-1

単純に言った(と他のソリューションを読んで)例えばとして、標準C関数strcpyを使用する必要があり、そのメモリは削除するあなたではありません。

+0

これは質問に答えようとしない悪い答えです。これはコメントとしては良いでしょう。それでも、malloc()とfree()はC言語で使われていると言われています。「メモリはあなたのものではありません」というのは理解するよりも簡単です。 – dckuehn

関連する問題