簡體   English   中英

為什么在下面的代碼中將垃圾值分配給已聲明的變量?

[英]Why is garbage value being assigned to an already declared variable in the code below?

這是一個描述起來有點復雜的問題,調試起來非常令人沮喪。 這是我正在處理的一項任務,所以請不要完全修復我的代碼,但可能會提供一些指導。

我正在創建一個 *card_t 指針數組,然后通過輸入重定向提供一系列信用卡數據,這些數據包括:加密的卡 ID(8 個字符)、每日限額和交易限額。 %%%%%% 表示輸入結束。 輸入按字母順序排序。

輸入看起來像:

2uu2iywy 7000 120
op81hs12 1000 50
zh8102ol 4300 90
%%%%%%%%

我使用的結構如下所示:

typedef struct{
    char id[ID_LENGTH + 1];
    int daily_limit;
    int transaction_limit;
} card_t;

Stage_one 的代碼:

為第一個結構指針分配 memory,然后我們讀取第一行輸入。


/*reads one card, puts into appropriate struct attribute
    return 1 if read successfully, 0 if reached % split*/
int read_one_card(card_t *one_card) {
    int x, i = 0;
    while(((x = getchar()) != EOF) && (x != ' ')) {
        if(x == '%') return 0;
        if(x != 10) {
            one_card->id[i++] = x;
        }
    }
    one_card->id[i] = '\0';
    scanf("%d", &one_card->daily_limit);
    scanf("%d", &one_card->transaction_limit);

    return 1;
}

void stage_one(card_t **accounts) {

    *accounts = (card_t*)malloc(sizeof(card_t)); //Allocate memory for one account

    read_one_card(*accounts);

    print_header(1);

    printf("Card ID: %s\n", accounts[0]->id);
    printf("Daily limit: %d\n", accounts[0]->daily_limit);
    printf("Transaction limit: %d\n", accounts[0]->transaction_limit);
}

第 2 階段做同樣的事情,但會讀取直到 %%%%%% 分隔符的所有內容,這是它變得非常奇怪的時候。 例如,使用示例輸入(輸出在帖子末尾):

3tu2iywy 10000 800
ceww0p66 150 100
v0xyil5t 3000 500
vb3dtxp0 5000 300
xnwxw8tl 2000 800
%%%%%%%%%%

除了最后 2 次迭代外,所有內容都按預期打印,因此對於最后一行輸入以及當我將 NULL 分配給最終指針以指示讀取已終止時。 帳戶[0]->id 的 output 變為某個隨機值。

void stage_two(card_t **accounts) {
    int i = 1, is_card;
    while(1) {
        accounts[i] = (card_t*)malloc(sizeof(card_t)); 
/*I noticed here, after the above line is run, accounts[0] gets reassign to some garbage value*/
        printf("accounts[0]->id : %s\n", accounts[0]->id);
        if(!read_one_card(accounts[i])){
            accounts[i] = NULL;
            break;
        } 
        i++;
    };
}

令人沮喪的想法是,如果將其用作輸入:

ceww0p66 150 100
deww0p11 100 100
eeww0p22 105 101
%%%%%%%%%%

它工作得很好,所以我現在完全糊塗了。 我想可能是因為我弄錯 output 的時間是因為第一個字符是數字,但這真的不應該是問題,因為在將“3”更改為隨機字母后,我仍然遇到問題。 我嘗試刪除第一行,問題仍然存在,第一個結構指針以某種方式改變。 然后我厭倦了將“3tu2iywy”作為第一行添加到第二組輸入中,然后問題再次出現。

這是 output,在調用 function 后打印數組中每個結構的每個屬性。

Card ID: ーナ
Daily limit: 0
Transaction limit: 800
==============================
Card ID: ceww0p66
Daily limit: 150
Transaction limit: 100
==============================
Card ID: v0xyil5t
Daily limit: 3000
Transaction limit: 500
==============================
Card ID: vb3dtxp0
Daily limit: 5000
Transaction limit: 300
==============================
Card ID: xnwxw8tl
Daily limit: 2000
Transaction limit: 800
==============================

第一個 output 的卡 ID 總是不同的,每日限制有時會變為 0,有時不會。 這個錯誤真的是隨機的,這讓人很沮喪。 使用第二組輸入,我得到了預期的結果:

Card ID: ceww0p66
Daily limit: 150
Transaction limit: 100
==============================
Card ID: deww0p11
Daily limit: 100
Transaction limit: 100
==============================
Card ID: eeww0p22
Daily limit: 105
Transaction limit: 101
==============================

解決了這個問題,感謝一些建議,在處理最小可重現示例時,它讓我注意到我完全忘記在主 function 中重新分配額外的 memory。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM