C:局部指针变量sscanf的问题后更改
问题描述:
我写了一个C代码,它的部分是:C:局部指针变量sscanf的问题后更改
...
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(最后一行)*头& * CUR变化值执行后(他们不是NULL了!)
有什么问题?
谢谢
答
你有什么是典型的缓冲区溢出。您正在将一个字节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];
非常感谢你。 – RYN 2010-07-31 20:39:59
我没有理由给你提供真正好的答案。所以+1,很高兴你在这里。 – 2010-07-31 22:12:05