C:sscanf问题后局部指针变量发生变化

时间:2010-07-31 20:20:55

标签: c pointers

我写了一段C代码,其中一部分是:

...
    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);
...

执行* head&的最后一个sscanf(最后一行)值后*改变(它们不再是NULL !!)
有什么问题?

由于

2 个答案:

答案 0 :(得分: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];

答案 1 :(得分:0)

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