内存Clobbering错误

时间:2011-07-04 12:25:29

标签: c memory-leaks malloc

我有一小段代码。我用-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;
}

4 个答案:

答案 0 :(得分:8)

您正在递增ptr,因此更改它指向的地址。你不能这样做。

在您的情况下,有一个单独的指针,让我们说char * p = ptr并使用p执行您的操作,保留ptr,以便您稍后free(ptr)

编辑再看看你的代码,我发现你不应该做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;
}

答案 1 :(得分:2)

因为ptr不再指向您分配的内存的基础。

答案 2 :(得分:1)

此外,在增加ptr后,表达式ptr[i]不会返回您所期望的内容;这就是输出以“hlo”开头的原因。

答案 3 :(得分:1)

在评论中找到答案。 当您分配一些内存时,通常情况下,内存管理框架会通过向分配的内存区域添加更多信息(您可以说是页眉和页脚)来跟踪它。释放此内存时,会匹配相同的信息,以便检测任何不需要/无效的内存访问。

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

    char *ptr = NULL;
    char* temp = NULL;           // Have a temp pointer.

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

    temp = ptr;                 // manipulate temp pointer instead of ptr itself

    int i = 0;
    for(i = 0; i<LEN; i++)
    {
        printf("ptr[%d] = %c\n", i, temp[i]);
        temp++;                 // Why you are incrementing this? Just to print, there is no need of this.
    }
    free(ptr);


    return 0;
}