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