gpt4 book ai didi

c - 在屏幕上打印链表时程序崩溃

转载 作者:太空宇宙 更新时间:2023-11-04 01:58:30 25 4
gpt4 key购买 nike

我不知道为什么我可以毫无问题地读取 LABEL 中的链表:1;但程序只是崩溃并在 LABEL 中打印 grabage : 0 ;换句话说,为什么链表在 lecture 函数内部工作正常,但在外部却不行?这是我的代码:

/* including libraries */
#define V 20

typedef struct DATA{
char* NomP;char* NomA;
struct DATA *Next;
}DATA;

// Prototypes .

int main(void)
{
char FileName[V];
puts("Data file ? : ");gets(FileName);

FILE* fs = fopen(FileName,"r"); // Check if fs is NULL

DATA *HEAD = MALLOC(sizeof (DATA)); int len = lecture_data(fs,HEAD);
print_data(HEAD,len); //LABEL : 0
return 0;
}

int lecture_data(FILE *fs,DATA *ROOT)
{
char cNom[V],cArticle[V];
int eofs=0;int i=0;

while(!eofs)
{
DATA *Data = MALLOC(sizeof (DATA));
fscanf(fs,"%s %s",cNom,cArticle);
Data->NomA = MALLOC(strlen(cArticle)+1);
Data->NomP = MALLOC(strlen(cNom)+1);
strcpy(Data->NomA,cArticle);
strcpy(Data->NomP,cNom);
if( i==0 )
{
Data -> Next = NULL ;
ROOT = Data ;
}
else
{
DATA* Ptr = ROOT ;
while( (Ptr->Next) != NULL )
{
Ptr = (Ptr -> Next);
}
Data -> Next = NULL ;
Ptr -> Next = Data ;
}
i++;
eofs = feof(fs) ;
// check ferror(fs) here
}
puts("Start of reading :");

print_data(ROOT,len); // LABEL : 1

puts("End Of Reading ");
fclose(fs);
return i;
}

这里是打印函数:

void print_data(DATA *L_ROOT,int len)
{
int i = 0 ;
DATA* LINK;
LINK = L_ROOT;
while( LINK != NULL )
{
printf("%d : DATA->NomA : %s\n",i,LINK->NomA);
printf("%d : DATA->NomP : %s\n",i,LINK->NomP);
LINK = LINK -> Next ;
i++;
}
}

最佳答案

您在 main 函数中为列表的根分配数据,并将其传递给该函数,以便它可以填充列表,但第一次分配元素时,您会覆盖 ROOT 指针值。

这会让你失去函数和外界之间的唯一联系(因为返回值只是一个数字),所以 main() 中的 HEAD 值没有指向任何有意义的东西(因为你的函数从不使用它) ,而该列表仍分配在某个外部没有人指向的内存位置,这意味着它丢失了。运行 valgrind 将能够识别这一点。

您可以通过将 (i==0) 大小写从 - 更改为来解决此问题

ROOT = Data ;

进入

ROOT->next = Data ;

但请确保稍后忽略根节点的数据。

附注- 使用大写变量和类型被认为不是一个好主意(它主要为宏保留)。它还使您的代码看起来像您在大喊:)

关于c - 在屏幕上打印链表时程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30413889/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com