我写了一段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 !!)
有什么问题?
由于
答案 0 :(得分:4)
您拥有的是经典的缓冲区溢出。您正在读取一个字节Name
中的20个字符,并且在head
和cur
占用的空间上写入了额外的字符,超出该字符,可能会践踏存储的返回信息在堆栈上。如果您以十六进制格式打印head
和cur
的值,则可能会发现这些值与Name
中输入的数据相对应。例如,如果您在Name
中输入“AAAAAAAAAAAAAAAAAAAA”,如果您使用的是32位计算机,则可能会发现head
和cur
都包含0x41414141。
您需要将Name
放入数组中 - 然后您可以放弃'&'当你把它传递给sscanf()
时。可能是你期望的:
char Name, tmp[255];
将Name和tmp声明为255个字符的数组;但这不是C的工作方式。声明等同于:
char Name;
char tmp[255];
答案 1 :(得分:0)
检查fopen()的文档。并c-faq