更新:應該是scanf的問題。scanf在讀取一個字符串之后再讀取數字,有時就會出現問題。
你可以試試這幾句話:
chars[20];
scanf("%s",s);
printf("string:%s:stringend\n",s);
charc=getchar();
printf("char:%c:charend\n",c);
如果你輸入一個前后帶幾個空格的字符串,比如“123”,你會發現s忽略了前面的空格,讀入了非空格字符(123),然后停在了后面的第一個空格,并把這個空格放回輸入流了。所以,第二行就會立即執行,讀入一個空格然后輸出。
這是個很有可能的原因...不過更詳細的錯誤可能需要你提供多一點的信息,比如輸入樣例和報錯信息了。我自己試過,沒有遇到問題。
---
我覺得最有可能的原因是struct的對齊問題,你可以把struct定義里頭float挪到最上面試試。因為struct的對齊問題是不同編譯器不太一樣的,你可以提供多點信息,比如用的哪個編譯器,和報錯信息。
因為聽你的描述,struct大小從28字節變成32字節就能正常運行,所以可能是這里的問題。
但是我跑過你的代碼了,我能正常運行,雖然我要把flushall()改成_flushall()
#include<stdio.h>
#include<malloc.h>
structStudent{
charname[20];
shortintage;
floatscore;
};
intmain(void){
intlen;
inti;
structStudent*pArr;
printf("%d\n",sizeof(structStudent));
printf("請輸入學生個數:\n");
printf("len=");
scanf("%d",&len);
_flushall();
pArr=(structStudent*)malloc(sizeof(structStudent)*len);
for(i=0;i<len;i++){
printf("請輸入%d\n",i+1);
_flushall();
printf("score=");
scanf("%lf",&pArr[i].score);
_flushall();
printf("name=");
scanf("%s",pArr[i].name);
printf("age=");
scanf("%d",&pArr[i].age);
}
free(pArr);
return0;
}
說明有可能咱們的編譯器不一樣~