1. ホーム
  2. c

[解決済み】メモリー・クロバリング・エラー

2022-01-31 20:01:37

質問内容

私は小さなコードを持っています。私はそれを -lmcheck 同じようなエラーが発生するコードをデバッグしようとしているためです。

このコードを実行すると、このエラーが発生します。

memory clobbered before allocated block

の理由を説明してください。 free(ptr) がこのエラーを投げるのでしょうか?

他にどのようにポインタを解放すればよいのでしょうか?

ありがとうございます。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#define LEN 5


int main(int argc, char *argv[]){

    char *ptr = NULL;

    ptr = (char *) malloc(LEN+1);// +1 for string
    strcpy(ptr, "hello");

    int i = 0;
    for(i = 0; i<LEN; i++)
    {
        printf("ptr[%d] = %c\n", i, ptr[i]);
        ptr++;
    }
    free(ptr);


    return 0;
}

解決方法は?

インクリメントしている ptr したがって、それが指すアドレスが変更されます。そんなことはできません。

あなたの場合、別のポインタ、たとえば char * p = ptr で操作し p 退出 ptr ができるように、そのまま free(ptr) を後回しにする。

EDIT あなたのコードをもう一度見てみると、あなたがやっているのは ptr++ ということです。配列内の文字にアクセスする際に ptr[i] をいじると ptr ポインタを使用する場合、ベースアドレスを変更し、文字にアクセスする際に ptr[i] は、予期せぬ結果を導く可能性がある(と思われる)。

単純にその行を削除すると( ptr++ というように、あなたのコードは魔法のように動きます。 もし、ポインタの概念を探求し、別の解決策を試したいのであれば、コードは次のようになるはずです。

int main(int argc, char *argv[]){

    char *ptr = NULL;
    char * p; 

    ptr = (char *) malloc(LEN+1);// +1 for string (please check for NULL)
    p = ptr;

    strcpy(ptr, "hello");

    int i = 0;
    while (*p) // note how I changed it to a while loop, C strings are NULL terminated, so this will break once we get to the end of the string. What we gain is that this will work for ANY string size.
    {
        printf("ptr[%d] = %c\n", i++, *p); // here i dereference the pointer, accessing its individual char
        p++;
    }
    free(ptr);


    return 0;
}