[英]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.