试冻 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 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀