ansi c结构{带有动态数组}分配给realloc数组
为什么下面的代码给我错误的“双重自由或腐败”。。。当我使用gcc编译和运行时[(Debian 4.4.4-8)4.4.5 20100728(预发布)]。提前谢谢ansi c结构{带有动态数组}分配给realloc数组,c,C,为什么下面的代码给我错误的“双重自由或腐败”。。。当我使用gcc编译和运行时[(Debian 4.4.4-8)4.4.5 20100728(预发布)]。提前谢谢 #include <stdio.h> #include <stdlib.h> typedef struct { int *index1; } data; void doo(int *); int main(int argc, char *argv[]) { int *a = (int *) malloc
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int *index1;
} data;
void doo(int *);
int main(int argc, char *argv[])
{
int *a = (int *) malloc(10*sizeof(int));
int i;
for(i=0; i<10; i++)
{
a[i] = 2*i;
}
doo(a);
data one;
one.index1 = a;
printf("%d\n", one.index1[4]);
free(a);
printf("%d\n", one.index1[4]);
free(one.index1);
return 0;
}
void doo(int *b)
{
b = (int *) realloc(b, 5*sizeof(int));
return;
}
#包括
#包括
类型定义结构
{
int*index1;
}数据;
虚斗(int);;
int main(int argc,char*argv[])
{
int*a=(int*)malloc(10*sizeof(int));
int i;
对于(i=0;i,因为“a”和“one.index1”指向的存储是相同的(在第一次printf之前的赋值)。因此您有一个双空闲。您正在向doo传递一个指针。您修改了指针本身,但主函数没有获得新地址
one.index1=a;
...
free(a);
...
free(one.index1);
...
void doo(int *b)
{
b = (int *) realloc(b, 5*sizeof(int));
return;
}
因此,双重自由
void doo(int *b)
{
b = (int *) realloc(b, 5*sizeof(int));
return;
}
当您将a指针传递到此函数时,其值(实际上是一个地址)被复制到另一个本地int指针b中。
现在,当你为5个整数重新分配空间时,它会改变一个整数的空间分配。所以你的空间会从10个整数减少到5个整数
按照OP的要求,要获得相同的数据和单独的内存指针,必须重新为新指针分配空间,因为指针毕竟只是一个变量,包含一个地址。如果分配两个单独的块,您将获得两个单独的地址,可以单独释放。这是因为您将设为1.index1
和a
指向相同的内存位置
要测试此功能,请在代码中添加以下内容:
one.index1 = a; // from now on, both variables point to the same address
printf("-> 0x%x\n", one.index1);
printf("-> 0x%x\n", a);
printf("%d\n", one.index1[4]);
free(a); // release the resource pointed by a
// You should not try to print the data of one.index1[4] since
// that piece of memory doesn't exist no more.
printf("%d\n", one.index1[4]);
free(one.index1); // Problem: trying to free the same memory resource TWICE.
您会注意到,两个指针将打印相同的内存地址。因此,在执行free(a);
之后,执行free(one.index1);
是多余的,尝试释放不再分配的资源是问题的原因。如何获取存储在“one.index1”中的“a”的副本不是指针?@pmg,OP正在缩小分配的内存空间。为什么会导致地址的任何重新定位或更改?猜测它内部的工作方式并不是产生错误代码的原因!实现可能会改变。我现在必须快点,无法检查标准…我很确定它允许realloc()若要在任何条件下移动对象,请显示是否可以获取存储在“one.index1”中的“a”的副本而不是指针?a有一个地址。此地址将复制到one.index1。因此,现在两者都有相同的地址。如果执行free()在一个实例中,从该地址开始分配的空间被释放。如果再次尝试释放相同的空间,您将遇到错误。那么,是否有必要将克隆称为“a”,并将该克隆分配给“one.index1”?以便“a”和“one.index1”都被释放将具有相同的数据,但具有单独的内存指针。您必须分配空间并将数据复制到新空间。因此,您将获得两个内存块,每个内存块都可以释放。此外,现在您已经获得了“单独”指针,因为a&one.index1具有不同的地址。如何获得存储在“one.index1”中的“a”的副本不是指针?不能使用“%x”格式说明符打印地址,并期望在所有系统上都有合理的输出。请使用“%p”格式说明符并将地址强制转换为void*
(并且不要期望在所有系统上都有合理的输出)@pmg谢谢。你可以随心所欲地打印。如果你有2个问题要问,开始2篇文章。不要重复使用一篇文章来提出另一个问题。欢迎来到SO,玩得开心!