2016-07-23 6 views
-4

以下のコードで何が間違っているのか、なぜ "ポインタが解放されていませんでした"というエラーが表示されます。 clangの使用。ポインタが解放されているが、Cで割り付けられていない

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

static char * messagePtr; 

int main() 
{ 

    messagePtr = (char *)malloc(sizeof(char) * 800); 
    if(messagePtr == NULL) { 
     printf("Bad malloc error\n"); 
     exit(1); 
    } 


    // //gameLoop(); 
    char outputMessage[50] = ""; 
    messagePtr = outputMessage; 

    free(messagePtr); 
    messagePtr = NULL; 

    return 0; 
} 
+6

'messagePtr = outputMessage;' =以前に割り当てた(今は流出した)ダイナミックメモリを指していません。それが表示されない場合は、使用している本やチュートリアルの中の動的メモリ管理に関するセクションを確認する必要があります。 – WhozCraig

+2

C言語で 'malloc'のキャストは必要ありません。削除するほうがいいです。 –

+1

これを覚えておいてください。"ポインタを解放 "しないで、**の**メモリを解放してください! (私は本当にそのようなナンセンスを広げる教師と深刻な話をしたい - 混乱を大幅に軽減する) – Olaf

答えて

2

あなたは、messagePtrに、配列であり、配列の最初の要素へのポインタに変換され、malloc()またはその家族を介しallcatedれるものでそうmessagePtrもはやポイントoutputMessageが割り当てられていません。 NULLではなく、例えばmalloc()などのメモリ管理機能を介して割り当てられていないもの渡す

未定義の動作を呼び出します。 (N15707.22.3.3フリー関数)

you shouldn't cast the result of malloc() in Cと書いてあることに注意してください。

あなたのオプションの一部は以下のとおりです。離れてスローされますバッファを割り当てるためのmalloc()を使用して

1.停止。

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

static char * messagePtr; 

int main() 
{ 

    // //gameLoop(); 
    char outputMessage[50] = ""; 
    messagePtr = outputMessage; 

    messagePtr = NULL; 

    return 0; 
} 

2.無料バッファ前がそれを捨てます。

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

static char * messagePtr; 

int main() 
{ 

    messagePtr = malloc(sizeof(char) * 800); 
    if(messagePtr == NULL) { 
     printf("Bad malloc error\n"); 
     exit(1); 
    } 


    // //gameLoop(); 
    free(messagePtr); 
    char outputMessage[50] = ""; 
    messagePtr = outputMessage; 

    messagePtr = NULL; 

    return 0; 
} 

3. strcpy()を使用して文字列をコピーします。

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

static char * messagePtr; 

int main() 
{ 

    messagePtr = malloc(sizeof(char) * 800); 
    if(messagePtr == NULL) { 
     printf("Bad malloc error\n"); 
     exit(1); 
    } 


    // //gameLoop(); 
    char outputMessage[50] = ""; 
    strcpy(messagePtr, outputMessage); 

    free(messagePtr); 
    messagePtr = NULL; 

    return 0; 
} 
+0

strcpy()私が探していた機能でした。私は多くのチュートリアルを見て、ウェブ上でたくさん検索し、ここで解決策が簡単だろうと思っていましたが、それは見つけられませんでした。皆さんありがとうございました。 – Steven2163712

3

char outputMessage[50] = ""; 
messagePtr = outputMessage; 

mallocEDメモリへのポインタを除去し、こうしてmessagePtrそのアレイのアドレスをchar[50]を作成して割り当てます。したがって、freeコールは、mallocによって割り当てられたメモリではなく、messagePtrを解放しようとします。これだけでなく、mallocメモリは、参照(つまり、ポインタ)がすべて消失してしまったため、失われてしまいます。

私はあなたがmessagePtr = outputMessageによって達成しようとしているか全くわからないので、私は本当にあなたにこれを解決するためのヒントを与えることができない - を除いて前freemallocによって返されたポインタを再割り当てませんそれはです。


注:

  • 他のポインタ型に、mallocによって返されたあなたは、void*をキャストする必要はありません。そのための暗黙的な変換があります。 why not to cast the return value of mallocを読んでください。
0
messagePtr = (char *)malloc(sizeof(char) * 800); 

messagePtrは、malloc関数は、800の文字(例えば1005)に割り当てられたヒープ内の場所を指すことができます。この場所は解放する必要があります。

messagePtr = outputMessage; 

ここで、50個の文字が自動的に割り当てられる場所(505など)のstackの位置を示すmessagePtrを作成します。

自動割り当てを無料で解放することはできません。変数のスコープが終了すると自動的に割り当てが解除されます。 自動的に割り当てられたメモリで空きを呼び出すのはエラーです。場所1005(この例によると)上でfreeを呼び出さなければならない。

関連する問題