#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include <math.h>
typedef struct label{
int id;
double p,*t,q,c;
int V[45];
struct label *next;
struct label *prev;
struct path *tail;
struct path *head;
}label;
typedef struct path{
int i;
struct path *Pperv;
struct path *Pnext;
}path;
void main (){
int i,j,k;
struct label *Current,*FCurrent,*Current2,*Head,*Tail,*FHead,*FTail;
struct path *cur,*test3,*test2,*test1,*path_head,*path_tail;
Head=(struct label*)malloc(1*sizeof(struct label));
Tail=(struct label*)malloc(1*sizeof(struct label));
Head->next=Tail;
Tail->prev=Head;
FHead=(struct label*)malloc(1*sizeof(struct label));
FTail=(struct label*)malloc(1*sizeof(struct label));
FHead->next=FTail;
FTail->prev=FHead;
for (i=0;i<250000;i++)
{
//printf("%d",i);
Current=(struct label*)malloc(1*sizeof(struct label));
Current->t=(double*)malloc(15*sizeof(double));
Current->head=(struct path*)malloc(1*sizeof(struct path));
Current->tail=(struct path*)malloc(1*sizeof(struct path));
Current->head->Pnext=Current->tail;
Current->tail->Pperv=Current->head;
for (j=0;j<15;j++)
{
test1=(struct path*)malloc(1*sizeof(struct path));
test1->Pperv=Current->head;
test1->Pnext=Current->head->Pnext;
Current->head->Pnext->Pperv=test1;
Current->head->Pnext=test1;
test1->i=1;
Current->t[j]=23123.43;
}
if (i % 4!=0)
{
Current->next=Tail;
Current->prev=Tail->prev;
Tail->prev->next=Current;
Tail->prev=Current;
Current->p=54545.323241321;
}
else
{
Current->next=FTail;
Current->prev=FTail->prev;
FTail->prev->next=Current;
FTail->prev=Current;
}
}
Current=Head->next;
while(Current->next!=Tail)
{
Head->next->next->prev=Head;
Head->next=Head->next->next;
test1=Current->head->Pnext;
while(test1!=Current->tail)
{
test2=test1;
test1=test1->Pnext;
free(test2);
}
free(Current->t);
free(Current->head);
free(Current->tail);
free(Current);
Current=Head->next;
}
Current=FHead->next;
while(Current->next!=FTail)
{
FHead->next->next->prev=FHead;
FHead->next=FHead->next->next;
k=0;
test1=Current->head->Pnext;
while(test1!=Current->tail)
{
test2=test1;
test1=test1->Pnext;
free(test2);
k++;
}
free(Current->t);
free(Current->head);
free(Current->tail);
free(Current);
Current=FHead->next;
}
}
我遇到了以下问题。这不是我的实际问题,它只是我创建的一个例子,以便更容易查看问题。正如你在这个例子中看到的那样,我有两个结构,一个在另一个内部,示例的作用是创建类型标签的新结构,并在列表中使用指针FHead和FTail将它们中的4个放入3中4个时间在列表中,指针是Head和Tail。问题是当我尝试释放结构时它没有发生,语法是100%正确的,因为当我保存两个列表中的一个列表中的所有结构时,费用函数工作得很好。这导致了我使用指针时发生错误的结果,不幸的是我是C中的新手,所以我不太清楚整个指针是怎么回事。所以如果有人可以解释指针的使用出了什么问题,我将非常感谢,如何在ordr中创建tese列表以使frre函数正常工作。 提前谢谢你......
答案 0 :(得分:0)
您的代码很难阅读,因为您只有很长的功能,并且会发生很多事情。即使是经验丰富的C也难以阅读,因此对于C初学者来说一定非常难。如果将此功能拆分为较小的,非常专业的功能,则可能更容易理解并发现错误。
在旁注(即使错误可能不是来自这里,不这样做是非常糟糕的做法):每次调用malloc时,都必须检查它是否失败。 Malloc可能无法为您提供一些内存,在这种情况下它会返回NULL。例如:
test1=(struct path*)malloc(1*sizeof(struct path));
可能会成为
test1 = (struct path*)malloc(1*sizeof(struct path));
if (test1 == NULL) {
abort(); /* Makes the program stop abruptly */
}
如果您没有检查并获得NULL结果,那么您的程序将具有不稳定的行为;这些错误很难找到。
编辑:正如评论所建议的那样,一个更好的风格是
test1 = malloc(sizeof(path));
if (test1 == NULL) {
abort(); /* Or something else that makes sense */
}