C - 变量 'p_prvy' 正在使用而未初始化

C - The variable 'p_prvy' is being used without being initialized

本文关键字:初始化 变量 prvy      更新时间:2023-10-16

我正在尝试编译我的代码,但我无法编译它。我正在使用VS 2010,并收到以下消息:

"Tel_zoznam.exe":已加载"C:\Windows\SysWOW64\msvcr100d.dll",已加载符号。 运行时检查失败 #3 - 变量"p_prvy"正在使用未初始化。

它停在p_prvy->next = NULL;

这是我的代码:

#include "stdafx.h"
#define MAX 31
typedef struct ZOZNAM{
    char meno[MAX];
    char priezvisko[MAX];
    char cislo1[MAX];
    char cislo2[MAX];
    char cislo3[MAX];
    struct ZOZNAM *next;
} ZOZNAM;
int main(void){
    char c;
    ZOZNAM * p_prvy;
ZOZNAM * p_akt;
    p_prvy->next = NULL;
    int z;
    p_akt=p_prvy;
    printf(" Pre pridanie kontaktu do zoznamu stlacte 'p'n Pre vypis zoznamu zadajte 'v'n Pre ukoncenie programu zadajte 'k'n");
    z=pocet_zaznamov();
    printf("%d",z);
    while(1==1){
        scanf("%c",&c);
        switch(c){
            case 'p': vlozit(p_akt); break;
            case 'v': vypis(p_prvy); break;
            case 'n': nacitanie(p_akt); break;
        }
    }
    return 0;
}

它几乎告诉你错误是什么:你在初始化变量之前使用它,因此你正在调用未定义的行为。

ZOZNAM *p_prvy;
p_prvy->next = NULL;

是错误的,因为您尚未为p_prvy分配内存,但已取消引用它。为您的数据类型创建一个构造函数(并考虑您的设计)。

main() 函数中,您有以下 p_prvy 变量声明:

ZOZNAM * p_prvy;

几乎在那之后,你说:

p_prvy->next = NULL;

这意味着您正在使用p_prvy变量。但是,它未被初始化,因此具有未指定的值。这称为未定义行为,或简称为 UB。

您需要做的是初始化该指针。例如,通过分配一些内存:

ZOZNAM * p_prvy = (ZOZNAM *)malloc(sizeof(ZOZNAM));

您也可以将其初始化为 NULL,但随后取消引用 NULL 将使进程关闭。