【新手提问】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;
}

错误代码

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

运行结果

图片说明

    p = (LNode *)malloc(sizeof(LNode));//开辟新结点
    p->next = NULL;
->
        p = (LNode *)malloc(sizeof(LNode));//开辟新结点
                p->no[0[ = '\0';
                p->name[0] = '\0';
    p->next = NULL;