ansi c结构{带有动态数组}分配给realloc数组

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

为什么下面的代码给我错误的“双重自由或腐败”。。。当我使用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(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,玩得开心!