1

コードをコンパイルしようとしていますが、コンパイルできません。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;
}
4

2 に答える 2

5

エラーが何であるかはほとんどわかります。初期化する前に変数を使用しているため、未定義の動作が呼び出されています。

ZOZNAM *p_prvy;
p_prvy->next = NULL;

p_prvyまだメモリを割り当てていないため、逆参照しているため、間違っています。データ型のコンストラクター関数を作成します (そして、設計について考えます)。

于 2012-12-12T20:32:12.043 に答える
3

関数には、次の変数main()の宣言があります。p_prvy

ZOZNAM * p_prvy;

その直後に、あなたはこう言います:

p_prvy->next = NULL;

これは、p_prvy変数を使用していることを意味します。ただし、初期化されていないため、値が指定されていません。これは、未定義動作、または単にUBと呼ばれます。

あなたがする必要があるのはそのポインタを初期化することです。たとえば、メモリを割り当てると、次のようになります。

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

NULLに初期化することもできますが、NULLを逆参照すると、プロセスが停止します。

于 2012-12-12T20:34:46.663 に答える