C:局部指针变量sscanf的问题后更改

问题描述:

我写了一个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了!)
有什么问题?

谢谢

你有什么是典型的缓冲区溢出。您正在将一个字节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

检查fopen()的文档。和c-faq