0

私は C が初めてで、リンクされたリストに対してアクションを実行するコードを書いています。コードを追加する前に、いくつかの追加情報を次に示します。

typedef struct Ticket Ticket;
    struct Ticket 
    {
        TTransaction *INFO;
        Ticket* next;
        Ticket* prev;
};

そして私の問題のあるコード:

void HANDLER1(TTransaction* New_node)
{
    Ticket * Database;
    if(!DB_Manager_Initialize)
    {
        Ticket * Database =(Ticket*)malloc(sizeof(Ticket));
        if(!Database)
        {
            OutputMgr_ReportTransaction(AXN_FAILURE,NULL);
            IM_END_OF_INPUT1(Database);
            exit(EXIT_FAILURE);
        }
        Database->next=NULL;
        Database->prev=NULL;
        Database->INFO=NULL;
        DB_Manager_Initialize=1;
    }
    switch(New_node->Operation)
    {
        case(IM_CREATE):
                IM_CREATE1(New_node,Database);
        case(IM_UPDATE):
                IM_UPDATE1(New_node,Database);
        case(IM_RETRIEVE):
                IM_RETRIEVE1(New_node,Database);
        case(IM_DELETE):
                IM_DELETE1(New_node,Database);
        case(IM_END_OF_INPUT):
                IM_END_OF_INPUT1(Database);
    }
}

最初に、「データベース」を初期化し、それをmallocして、その値をNULLに設定します。スイッチ関数の前に、私が持っているものはまさに私が期待するものです: データベースはチケット型構造体へのポインターであり、next,prev,info は NULL へのポインターです。

Visual で変数ウォッチを使用すると、スイッチ関数に入るとデータベース自体が NULL ポインターになることに気付きましたが、その理由はわかりません。

New_node は、2 つの文字、2 つの int、および 1 つの ENUM (操作) を含む「TTransaction」タイプの構造体です。

ヘルプ :-(

4

1 に答える 1

12

これは、最初のデータベースが 2 番目のデータベースによってシャドウされているためです。交換:

Ticket * Database;
if(!DB_Manager_Initialize)
{
    Ticket * Database =(Ticket*)malloc(sizeof(Ticket));

に:

Ticket *Database;
if(!DB_Manager_Initialize)
{
    Database = malloc(sizeof(Ticket));
于 2013-11-07T13:00:48.650 に答える