2010-07-31 28 views
0

我寫了一個C代碼,它的部分是:C:局部指針變量sscanf的問題後更改

... 
    P *head=NULL,*cur=NULL; 
    char Name,tmp[255]; 
    int AT,ET; 
    FILE *iF; 

    if((iF=fopen(fileName,"r"))>0){ 
     fgets(tmp,255,iF); 
     sscanf(tmp,"Interval:%d\n",&quantum); 
     fgets(tmp,255,iF); //waste 

     while(!feof(iF) && fgets(tmp,255,iF)){ 
      sscanf(tmp,"%20c %20d %20d",&Name,&AT,&ET); 
... 

最後的sscanf(最後一行)*頭& * CUR變化值執行後(他們不是NULL了!)
有什麼問題?

謝謝

回答

4

你有什麼是典型的緩衝區溢出。您正在將一個字節Name中的20個字符讀入,並且正在寫入headcur所佔用的空間以外的額外字符,並且可能會踐踏存儲在堆棧中的返回信息。如果以十六進制打印headcur的值,則可能發現這些值與在Name中輸入的數據相對應。例如,如果您在「Name」中鍵入「AAAAAAAAAAAAAAAAAAAA」,如果您正在使用32位計算機,則可能會發現headcur包含0x41414141。

您需要將Name放入一個數組中 - 當您將它傳遞給sscanf()時,您可以放下'&'。它可能是你期望的:

char Name, tmp[255]; 

聲明Name和tmp爲255個字符的數組;但這不是C的工作方式。聲明等同於:

char Name; 
char tmp[255]; 
+0

非常感謝你。 – RYN 2010-07-31 20:39:59

+0

我沒有理由給你提供真正好的答案。所以+1,很高興你在這裏。 – 2010-07-31 22:12:05