ZW钟文 2021-02-20 15:04 采纳率: 0%
浏览 15

在程序运行过程中这个片段p1->titile等成员的值在被赋值后是正确的但过个几个语句又变了?

student *luru()    //从txt文件中读取全部学生信息 
{
    fflush(stdin);    //清空缓冲区
    char temp0[200];
    FILE *fp;
    printf("请输入毕业设计信息文本文档的地址(path)    示例:C:\\\\output\\\\毕业设计信息.txt\n");
    while(1)
    {
        scanf("%s",temp0);
        getchar();
        fp=fopen(temp0,"r");
        if(fp==NULL)
        {
            printf("地址错误,请重新输入正确的文本文档地址\n");
        }
        else
        break;
    }
    student *p1,*p2,*head;
    int n=0;
    head=NULL;
    p1=p2=(student *)malloc(sizeof(student));
    while(fgets(temp0,160,fp)!=NULL)
    {
        n++;
        char *temp;
        temp=strtok(temp0,"\t");    ****************************************
        strcpy(p1->num,temp);
        temp=strtok(NULL,"\t");
        strcpy(p1->cla,temp);
        temp=strtok(NULL,"\t");
        strcpy(p1->major,temp);
        temp=strtok(NULL,"\t");
        strcpy(p1->title,temp);
        temp=strtok(NULL,"\t");
        strcpy(p1->score,temp);
        temp=strtok(NULL,"\t");
        strcpy(p1->num1,temp);
        temp=strtok(NULL,"\t");
        strcpy(p1->na,temp);
        temp=strtok(NULL,"\t");
        strcpy(p1->clf,temp);
        temp=strtok(NULL,"\t");
        strcpy(p1->jud,temp);
        if(n==1)
        head=p1;
        else
        p2->next=p1;
        p2=p1;
        p1=(student *)malloc(sizeof(student));  *******************************
    }
    p2->next=NULL;
    Sleep(15000);
    fclose(fp);
    return head;
}


急需大神回答为什么在建立动态链表的过程中结构体指针p1中的数据在被赋值后会变化!!!

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-24 11:38
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    这个问题可能是因为在分配内存时没有正确地释放原始内存。当你创建一个新的student对象时,你需要确保你已经释放了原始的student对象所占的空间。

    你可以通过在创建新的student对象之前调用free()函数来实现这一点:

    student *p1 = (student *)malloc(sizeof(student));
    if (p1 == NULL) {
        printf("Memory allocation failed!\n");
        exit(-1);
    }
    

    然后,在将新对象的引用传递给p1之前,你应该先检查它是否已经被初始化并释放原始内存。

    if (p1 != NULL) {
        free(p1);
        p1 = NULL;
    }
    
    // ... 后续代码 ...
    
    if (p1 != NULL) {
        free(p1);
        p1 = NULL;
    }
    

    这样,即使你在循环中修改了p1,你的代码也不会意外地改变原始student对象的内存。

    评论

报告相同问题?

悬赏问题

  • ¥15 (需要远程,AI不回)VB6二进制文件转换成功,但是C#转换总是失败
  • ¥15 关于#matlab#的问题:有没有什么其他办法能够保证不退出进程(相关搜索:matlab调用)
  • ¥15 依据报错在原代吗格式的基础上解决问题
  • ¥15 在虚拟机中安装flash code
  • ¥15 单片机stm32f10x编写光敏电阻调节3.3伏大功率灯亮度(光强越大灯越暗,白天正常光强灯不亮,使用ADC,PWM等模块)望各位找一下错误或者提供一个可实现功能的代码
  • ¥20 verilog状态机方法流水灯
  • ¥15 pandas代码实现不了意图
  • ¥15 GD32H7 从存储器到外设SPI传输数据无法重复启用DMA
  • ¥25 LT码在高斯信道下的误码率仿真
  • ¥45 渲染完成之后将物体的材质贴图改变,自动化进行这个操作