我写了一段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
,并且额外的字符被写入 head
和 cur
以及超出该空间的空间,可能会破坏存储在堆栈中的返回信息。如果您以十六进制打印 head
和 cur
的值,您可能会发现这些值对应于在 Name
中输入的数据。例如,如果您在 Name
中键入“AAAAAAAAAAAAAAAAAAAA”,您可能会发现 head
和 cur
都包含 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/