2011-12-26 8 views
1

私はこのレスポンスに困惑しています。誰かがこれを助け、私が間違っている箇所を指摘できますか?あなたがやっていることは、メモリの一部を割り当て、その場所(char *s)を格納しているメモリがクローブされました

free(s); // cannot free constant "heel" 

:codepadでの出力が「memory clobbered before allocated block

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

int main(void) 
{ 
    char *s = (char *)malloc(10 * sizeof(char)); 
    s = "heel"; 
    printf("%s\n",s); 
    printf("%c\n",s[2]); 
    printf("%p\n",s); 
    printf("%d\n",s); 
    free(s); 
    return 0; 
} 
+0

http://stackoverflow.com/questions/6571455/memory-clobbering-error –

答えて

11

であるあなたは、との一定のメモリを解放しようとしています。そのリファレンスを文字列定数 "ヒール"(メモリリーク)に上書きします。これはfreeにはできません。必要に応じてこれを動作させるために、あなたが割り当てられたメモリへの定数文字列をコピーする必要があります。ここでは

strcpy(s, "heel"); 

は、ユーザー入力を取得するための例です:

char *input = malloc(sizeof(char) * 16); // enough space for 15 characters + '\0' 
fgets(input, 16, stdin); 

// do something with input 

free(input); 
+0

Thanks Tim。それでは、mallocを使ってメモリを初期化し、s = "かかと"を使うことは2つの異なることですか? s = "heel"は自動的にメモリを初期化しますか? – kevin

+0

@kevin:プログラムが開始されると、文字列定数「ヒール」はメモリに格納され、読み取り専用です。 's =" heel "'はその読み込み専用文字列の場所に 's'を割り当てます。だからあなたが '自由にしようとしているとき'あなたはエラーを起こすでしょう。 –

+0

Tim Cooperに感謝します。 – kevin

1
char *s = (char *)malloc(10 * sizeof(char)); 
    s = "heel"; 

doesnのあなたが思う、あるいはより現代的な言語で期待することをしないでください

最初の行は、いくつかのメモリを割り当てます10charsのためのアドレスを返します。それは一定のメモリだ - ないfree(s)それをすることができます

1

漏れ -

2行目は、割り当てられたメモリへのリンクを失う「ヒール」含む、コンパイル時に割り当てられたメモリの一定のブロックを指すようにそのアドレスを変更します。

TimCooperの答え@上の展開するにはstrcpy(s,"heel");

1

s = "heel";を変更しよう:

  • まずあなたが実行します。その後、char *s = (char *)malloc(10 * sizeof(char));
  • s = "heel";

最初の行には、メモリを割り当て、そのメモリの場所をsに割り当てます。しかし、2行目はsをスタック上の定数文字列heelのメモリ位置に再割り当てします!

これは、スタック上でメモリを解放しようとしていることを意味しますが、これは不正です。 あなたは最初にsに割り当てられたものにアクセスできないため、メモリがリークします。

sが指し示すメモリに文字列を書きたい場合は、strcpy()(または、それ以上の場合はstrncpy())のような文字列を使用する必要があります。

関連する問題