最近在学习gets函数时,遇到了一点小问题,当时有点想不通,代码如下:
#include <stdio.h>
int main()
{
char a,b,c,d,e,f;
printf("%p\t%p\n",&a,&f);
gets(&a);
putchar(a);
putchar(b);
putchar(c);
putchar(d);
putchar(e);
putchar(f);
return 0;
}
执行结果是这样的:
我的本意是知道了一段内存的首地址,就可以使用gets函数输入数据,可是输出的结果
却出乎我的初衷。理论上,我输入“123456”,他应该正序输出“123456”,为什么结果
却是“134562”。起初,我以为是gets函数出了问题,可是我写了以下代码,就恍然大悟了!
#include <stdio.h>
int main()
{
char a,b,c,d,e,f;
gets(&a);
putchar(a);
putchar(b);
putchar(c);
putchar(d);
putchar(e);
putchar(f);
putchar('\n');
return 0;
}
编译后执行结果是:
这是按照正常情况输出了,所以说,gets函数是没有问题的。问题主要是在那个printf语句,
大家知道,在c中,局部变量实际使用时分配内存的,声明时是不分配内存的。所以第一个
程序使用了printf打印了变量a和f的地址,所以在gets之前,我们发现,他们的地
址是连续的。所以说,gets函数把第一个,第二个数据分别存储到变量a和f中,在
之后,才把后面的数据依次存储到剩余的变量当中。明白了这些,我写了另一个例子:
#include <stdio.h>
int main()
{
char a,b,c,d,e,f;
printf("%p\t%p\t%p\n",&a,&b,&f);
gets(&a);
putchar(a);
putchar(b);
putchar(c);
putchar(d);
putchar(e);
putchar(f);
return 0;
}
执行结果如下:
正验证了我的想法,呵呵