簡體   English   中英

在 C 中動態分配結構數組

[英]Dynamically allocating an array of structs in C

我正在為 CS1 做家庭作業,如果我們忘記了一些 C(主要是關於指針和 memory 分配),它應該能讓我們恢復速度。 我已經為此工作了超過 15 個小時,我需要一些認真的幫助。

問題告訴我們使用如下結構:

typedef struct LottoPlayer {
        char first[20];
        char last[20];
        int nums[6];
} KBLP;

我們應該讀取一個文件並為這些結構的數組動態分配 memory,然后我們可以將該信息用於 select 獲勝者 yada yada。 每當我運行我的代碼時,我都會不斷收到垃圾郵件。 所以這就是我所擁有的,我認為問題在於我的指針算法或我設置 malloc 的方式。

int main() {
    //Code to open the files

    int NumTickets;
    fscanf(infile, "%d", &NumTickets);
    KBLP *size=malloc(NumTickets*sizeof(KBLP));

然后,當我讀取文件並將其寫入數組時,我會

    int index; 
    int i;
    for (index=0; index < NumTickets; index++) { 
        fscanf(infile, "%s", size[index].last);
        fscanf(infile, "%s", size[index].first);
        for (i=0; i<6; i++) {
            fscanf(infile, "%d", size[index].nums[i]);
        }
    }

現在,我覺得我在這里遺漏了一些愚蠢的東西,因為當我調試並嘗試訪問 size[index].first 和那種性質的東西時,我得到了垃圾 memory。 我沒有正確分配它嗎? 我寫的不對嗎? 或兩者?

它應該是

fscanf(infile, "%d", &size[index].nums[i]);

注意第二個參數中的&運算符。 當然,@missingno 的回答中表達的擔憂也是有效的。

scanf組中的函數期望每個數據接收者的指針為 arguments。 您有責任在必要時應用&運算符。 編譯器通常無法驗證您是否傳遞了正確類型的值,因為這些函數的尾隨 arguments 是variadic ,即它們沒有預先確定的類型。 但是,一些編譯器(如 GCC)確實會努力執行檢查,這意味着您的代碼會針對上述問題觸發 GCC 編譯器的警告。

請注意,當您傳遞數組類型的 arguments 時,數組類型會自動“衰減”為指針類型,這就是為什么代碼中的前兩個fscanf不需要應用&運算符的原因。 但是,如果您願意,可以將這些fscanf重寫為

fscanf(infile, "%s", &size[index].last[0]);
fscanf(infile, "%s", &size[index].first[0]);

我想到了兩件事:

  • fscanf(infile, "%d", size[index].nums[i])size[...之前缺少& 你確定這個編譯沒有警告嗎?

  • fscanf(..., "%s", size[index].last)如果您的字符串超過19 個字符,則可以覆蓋內容(請記住,您需要一個額外的字符作為終止符)。 打印您的字符串以確保它們具有正確的長度。

第一個和最后一個填充確定,但你在 nums 中得到垃圾?

提示: fscanf("%d"....) 將要填充 integer 字段。 為此,它需要一個指針。 你給它什么?

暫無
暫無

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

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