出現問題會導致程式無法正常作業。我想這與在結構陣列中使用指標有關。盡管嘗試了很多方法,但沒有發現:
#include <stdio.h>
typedef struct {
char* courseName;
char* courseDate;
double grade;
}EXAM;
int main() {
double averageGrade = 0;
EXAM *exams[5];
for(int i = 0; i < 5; i ){
printf("Please enter course name:\n");
scanf("%s", exams[i]->courseName);
printf("Please enter course date:\n");
scanf("%s", exams[i]->courseDate);
printf("Please enter course grade:\n");
scanf("%lf", &exams[i]->grade);
averageGrade = exams[i]->grade;
}
averageGrade /= 5;
printf("Your average grade is: %.1lf.", averageGrade);
return 0;
}
uj5u.com熱心網友回復:
1:
typedef struct {
char* courseName;
char* courseDate;
double grade;
}EXAM;
將 courseName 和 courseDate 定義為 'char *' 意味著它們只是指標。沒有任何分配的指標指向 NULL 或更可能指向垃圾。如何解決?
使用靜態分配的字符陣列定義您的結構,例如:
typedef struct {
char courseName[41];
char courseDate[41];
double grade;
}EXAM;
或在簽署任何內容之前動態分配它們:
for (int i = 0; i < 5; i ) {
exams[i]->courseName = (char *) calloc(41, sizeof(char));
exams[i]->courseDate = (char *) calloc(41, sizeof(char));
}
在這兩種情況下,您都應該確保該用戶不會溢位此欄位,因此我建議使用“@[^\n]”代替 scanfs 中的“%s”,這只是從用戶獲取最多 40 個字符,直到你找到一個 '\n' 字符(用戶按回車鍵)。
此外,在第一種情況下,您應該確保兩個字串都是以空字符結尾的字串,一個簡單的方法是在所有表中設定零。
memset(exams, 0, sizeof(EXAM)*5);
2:
EXAM *exams[5];
這也只是指標。未分配的指向 NULL 或垃圾。選擇:
EXAM exams[5];
并使用“。” 而不是“->”。
或分配它們:
for (int i = 0; i < 5; i ) {
exams[i]= (EXAM *) calloc(1, sizeof(EXAM));
}
uj5u.com熱心網友回復:
EXAM[*] 指向未分配的記憶體:
要創建 5 個考試物件的陣列,請執行以下操作:
EXAM exams[5]; // Note there is no * character.
如果由于某種原因需要指標,那么您需要為這些物件分配空間:
EXAM *exams[5];
for (int i=0; i<5; i ) {
exams[i] = calloc(1, sizeof(EXAM));
}
您還需要為字串分配空間:
在 C 中,當您在 %s 上使用 scanf 時,必須已經為該字串分配了空間。
因此,您應該使用 char courseName[256];,在堆上為字串分配足夠的空間,或者使用類似的函式getline()為您分配空間。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/361319.html
下一篇:收縮時重新分配堆損壞
