代码之家  ›  专栏  ›  技术社区  ›  Ariyan

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

  •  0
  • Ariyan  · 技术社区  · 16 年前

    ...
        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(最后一行)后,*head&的值*cur change(它们不再为空!!)
    有什么问题吗?

    2 回复  |  直到 16 年前
        1
  •  4
  •   Jonathan Leffler    16 年前

    你有一个典型的缓冲区溢出。您正在一个字节中读取20个字符 Name ,多余的字符将被写入 head cur 除此之外,可能还会破坏存储在堆栈上的返回信息。如果你打印了 电流 姓名 . 例如,如果您在 姓名 ,你可能会发现 头 电流 如果您在32位机器上工作,则包含0x4141。

    你需要做点什么 放入一个数组-您可以将当你把它传给 sscanf() . 你可能期望:

    char Name, tmp[255];
    

    将Name和tmp声明为255个字符的数组;不过,C不是这样工作的。声明等同于:

    char Name;
    char tmp[255];
    
        2
  •  0
  •   Nyan    16 年前