试冻 2019-05-21 21:21 采纳率: 33.3%
浏览 369
已采纳

【新手提问】malloc函数会自行输出变量原始值?

刚学数据结构,在使用malloc函数时遇到了奇怪的问题:

不知道为什么用了malloc之后,运行会自行输出变量的原始值,我的printf函数明明输出的是存储后的值。

一开始程序会自行输出“屯屯屯屯屯屯屯屯”以及数字乱码,我百度之后就在malloc函数后对name数组、no数组和price赋了初值0,但程序还是自行输出了price的初始值0.00,如下图

图片说明

一些同学跟我一样的用法却没有这样的问题。

为什么会有这样的情况?怎样才能让初始值不自行输出?

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100

typedef struct LNode
{
    char no[20];
    char name[50];
    float price;
    struct LNode *next;
}LNode,*LinkList;

int main()
{
    int n=0;
    LNode *p,*q;
    LinkList L = (LNode *)malloc(sizeof(LNode));
    L->no[0]='\0';
    L->name[0]='\0';
    L->price=0;
    L->next = NULL;
    q = L;
    while (1)
    {
        p = (LNode *)malloc(sizeof(LNode));//开辟新结点
        p->next = NULL;
        scanf_s("%s %s %f", p->no, 20, p->name, 50, &p->price);
        if (p->no[0] == '0'&&p->name[0] == '0'&&p->price == 0)
            break;
        q->next = p;
        q = p;
    }
    p = L;
    while (p->next!= NULL)
    {//计结点个数
        n++;
        p = p->next;
    }
    p = L;
    printf("%d\n", n);
    while (p!=NULL)
    {//输出
        printf("%s %s %.2f\n", p->no, p->name, p->price);
        p = p->next;
    }
    system("PAUSE");
    return 0;
}
  • 写回答

2条回答 默认 最新

  • 北冥有鱼wyh 2019-05-22 08:25
    关注

    错误代码

        p = L;
        printf("%d\n", n);
        while (p!=NULL)
        {//输出
            printf("%s %s %.2f\n", p->no, p->name, p->price);
            p = p->next;
        }
    

    错误原因

    未注意头结点与第一个元素结点(首元结点)的区别。若有头结点,则头指针指向头结点,头指针的下一结点才是首元结点。若没有,则头指针指向首元结点。
    而在你的程序中是包含头结点的,所以你遍历输出时应该从首元结点开始。
    即将p = L;改为p=L->next。

    正确代码

    // WIN201905220810.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
    //
    
    #include "pch.h"
    #include <stdio.h>
    #include <stdlib.h>
    #define MAXSIZE 100
    
    typedef struct LNode
    {
        char no[20];
        char name[50];
        float price;
        struct LNode *next;
    }LNode, *LinkList;
    
    int main()
    {
        int n = 0;
        LNode *p, *q;
        LinkList L = (LNode *)malloc(sizeof(LNode));
        L->no[0] = '\0';
        L->name[0] = '\0';
        L->price = 0;
        L->next = NULL;
        q = L;
        while (1)
        {
            p = (LNode *)malloc(sizeof(LNode));//开辟新结点
            p->next = NULL;
            scanf_s("%s %s %f", p->no, 20, p->name, 50, &p->price);
            if (p->no[0] == '0'&&p->name[0] == '0'&&p->price == 0)
                break;
            q->next = p;
            q = p;
        }
        p = L;
        while (p->next != NULL)
        {//计结点个数
            n++;
            p = p->next;
        }
        //p = L;
        p = L->next;
        printf("%d\n", n);
        while (p != NULL)
        {//输出
            printf("%s %s %.2f\n", p->no, p->name, p->price);
            p = p->next;
        }
        system("PAUSE");
        return 0;
    }
    
    

    运行结果

    图片说明

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 一直显示正在等待HID—ISP