C 动态内存结构:free()失败,大小无效

C 动态内存结构:free()失败,大小无效,c,struct,free,dynamic-memory-allocation,C,Struct,Free,Dynamic Memory Allocation,我有一个C程序,为一个结构分配内存,然后释放它。但是,当我试图释放结构内部的字符数组时,我得到了无效的大小/指针错误。我确信该结构运行良好,因为我通过打印出结构内部的上下文进行了检查 typedef struct { double x; double y; double z; int index; char * atom_name; } atom; int main(void) { int i; atom * PMI = allocateatom(100

我有一个C程序,为一个结构分配内存,然后释放它。但是,当我试图释放结构内部的字符数组时,我得到了无效的大小/指针错误。我确信该结构运行良好,因为我通过打印出结构内部的上下文进行了检查

typedef struct
{
    double x;
    double y;
    double z;
    int index;
    char * atom_name;
} atom;

int main(void)
{
int i;
atom * PMI = allocateatom(1000); 

/* some operation that reads in information and stores inside PMI */

// Then frees the memory

char buffer[500] = "";
for (i=0; i<1000; i++)
{   
    strcpy(buffer, PMI[i].atom_name);
    printf("%d %s\n", i, buffer);
   // free(PMI[i].atom_name);
}
free(PMI[0].atom_name);
free(PMI[1].atom_name);

return 0;
}

atom * allocateatom(int num)
{
   atom * target = malloc(num * sizeof(atom));
   int i;
   for (i=0; i<num; i++)
       target[i].atom_name = malloc(5 * sizeof(char));

   return target;
}
typedef结构
{
双x;
双y;
双z;
整数指数;
字符*原子名称;
}原子;
内部主(空)
{
int i;
原子*PMI=allocateatom(1000);
/*一些读取信息并存储在PMI中的操作*/
//然后释放内存
字符缓冲区[500]=“”;

对于(i=0;i您已经为
atom\u name
分配了内存。但是,您没有将这些值设置为任何合理的值

当你使用

strcpy(buffer, PMI[i].atom_name);
由于
PMI[i],您正在运行未定义的行为。atom_name
未被设置为以null结尾的字符串

如果更改行:

for (i=0; i<num; i++)
   target[i].atom_name = malloc(5 * sizeof(char));

for(i=0;iSorry)我错过了那一行。它实际上是在我的代码中定义的。另外,打印块只是为了检查分配。谢谢你指出它。另外,我想问一个非常愚蠢的问题(在线搜索,但不确定我是否理解正确)。在struct define块中,如果我将atom_name定义为“char atom_name[5]”,而不是“char*atom\u name”,那么我就不必为它动态分配内存。但是变量本身,atom\u name在两种情况下都只是一个指针,对吗?只是一个用来堆叠内存,另一个用来堆内存?我可以对这两个都使用strcpy吗?如果你将它定义为
char atom\u name[5]
,它将是一个数组。与所有数组一样,它在大多数情况下都会衰减为指针,但它仍然是一个数组。非常感谢您的帮助!事实上,我从文件中复制了一些合理的字符串并存储在atom_名称中。(我通过/*某种读取信息并存储在PMI*/中的操作跳过了这部分代码)但我做的是:fgets(缓冲区,500,文件);sscanf(缓冲区,“%s”,mytext);PMI[I].atom_name=mytext。噢,我明白我做了什么蠢事了。这是因为我只是复制了指针,而不是atom_name的实际值吗?这就是为什么我们更喜欢看到一个。当你分发零碎的信息时,几乎不可能知道问题出在哪里。我很抱歉。我认为隐藏一些不必要的代码可以帮助其他人获得密钥想法更快。猜测永远不知道什么是不必要的。我可以继续吗?虽然执行atom_name=mytext只复制指针,但atom_name的内存已经分配。所以free()应该删除一些内存,对吗?或者这是C语言中另一种未定义的情况?很抱歉,我已经有一段时间没有编写代码了,所以我所有的问题看起来都很幼稚。@CrazyFrog,我不清楚您是如何以及是否能够解决您的问题。@R Sahu,我使用strcpy将我的文本分配给atom_name,而不只是在指针上进行复制。而且解决了这个问题。
for (i=0; i<num; i++)
   target[i].atom_name = malloc(5 * sizeof(char));
for (i=0; i<num; i++)
{
   target[i].atom_name = malloc(5 * sizeof(char));
   strcpy(target[i].atom_name, "test");
}