CCCynti
试冻
采纳率33.3%
2019-05-21 21:21

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

  • c语言
已采纳

刚学数据结构,在使用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条回答

  • qq_34801642 北冥有鱼wyh 2年前

    错误代码

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

    运行结果

    图片说明

    点赞 评论 复制链接分享
  • caozhy 从今以后生命中的每一秒都属于我爱的人 2年前
        p = (LNode *)malloc(sizeof(LNode));//开辟新结点
        p->next = NULL;
    ->
            p = (LNode *)malloc(sizeof(LNode));//开辟新结点
                    p->no[0[ = '\0';
                    p->name[0] = '\0';
        p->next = NULL;
    
    点赞 评论 复制链接分享

相关推荐