0
#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;
}







}

次の問題が発生します。これは私の実際の問題ではなく、問題を見やすくするために作成した単なる例です。この例でわかるように、私は 2 つの構造体をもう一方の内部に持っています。この例では、label 型の新しい構造体を作成し、ポインター FHead と FTail を持つリストに 4 回のうち 3 回、1 回のうち 1 回配置します。ポインター Head と Tail を含むリストの 4 回。問題は、構造体を解放しようとすると、それが発生していないことです.2つのリストの1つだけにすべての構造体を保存すると、料金関数が正常に機能するため、構文は100%正しいことです。それは、ポインターの使用で何か問題が発生しているという結果につながります。残念ながら、私はCが初めてなので、ポインター全体がどうなるかよくわかりません。したがって、ポインターの使用で何が問題になっているのか、frre関数が正しく機能するためにどのようにこれらのリストをxreateする必要があるのか​​ を誰かが説明できれば、私は非常に感謝しています。前もって感謝します...

4

1 に答える 1

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 */
}
于 2012-06-20T17:21:52.827 に答える