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

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

在执行最后一个 sscanf(最后一行)后,*head 和 *cur 的值发生变化(它们不再是 NULL!!)
有什么问题?

谢谢

最佳答案

您遇到的是典型的缓冲区溢出。您正在将 20 个字符读入一个字节 Name,并且额外的字符被写入 headcur 以及超出该空间的空间,可能会破坏存储在堆栈中的返回信息。如果您以十六进制打印 headcur 的值,您可能会发现这些值对应于在 Name 中输入的数据。例如,如果您在 Name 中键入“AAAAAAAAAAAAAAAAAAAA”,您可能会发现 headcur 都包含 0x41414141,如果您正在处理32 位机器。

您需要将Name 制作成一个数组——当您将它传递给sscanf() 时,您可以去掉'&'。这可能是您期望的:

char Name, tmp[255];

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

char Name;
char tmp[255];

关于C: sscanf 问题后局部指针变量改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3379671/

相关文章:

c - 如何通过C在csv文件的行尾写入新字符串

c++ - 第二次打印指针值返回错误结果

C++:将指针变量传递给函数

c - 如何从图像大小中提取列数和行数

c - 如何一次访问连续的结构体位字段成员?

c - 重新分配指向 char 的指针数组

c++ - 为什么用 new 创建的 C++ 数组与 C 样式数组的行为不同?

c - 用文件中的数据填充结构

string - 如何将 'string pointer' 转换为 Golang 中的字符串?

c - Variadic UNUSED 函数/宏