考虑代码
#include<stdio.h>
int main(void)
{
char* a;
scanf("%s",a);//&a and &a[0] give same results-crashes
printf("%s",a);
return 0;
}
为什么这段代码会导致崩溃?而这段使用字符数组的代码却可以正常工作?
#include<stdio.h>
int main(void)
{
char a[100];
scanf("%s",&a[0]);//works fine
printf("%s",a);
return 0;
}
区别在于字符数组和指针?但我知道指针只指向第一个元素,即 &a[0] 应该可以正常工作,但上面的代码对于 a、&a 和 &a[0] 这三个元素都会崩溃?
我要收集的主要内容是,如果我坚持仅使用 scanf,如何获取字符指针的输入?
如果我不清楚,我深表歉意。
提前致谢:)
Because char* a;
在堆栈上为字符指针分配空间,同时char a[100];
分配 100 个字符的空间。
在前一种情况下,您需要分配一些actual指针指向的内存。导致你崩溃的原因是a
被设置为某个任意值(您不初始化它),并且当您scanf
,这就是数据被写入的地方。如果你只是使用a
,让我们称其为第一种崩溃类型。
如果你使用&a
,它会将您的输入写入指针本身,这将给您留下一个指向谁知道在哪里的指针,从而导致第二种崩溃类型。假设您输入的字符数没有超过指针溢出的数量 - 这会破坏导致的调用堆栈another崩溃情况(类型三)。
作为建议,请不要使用没有边界检查的输入函数,除非您完全控制向它们呈现的数据。即使有一个char[100]
,有人可能会通过输入超出缓冲区容纳范围的字符来导致代码中的堆栈溢出。
我发现最好的办法就是使用fgets
(which can限制读取的字符)与sscanf
(尽管如果你得到的只是一个字符串,sscanf
并不是真正需要的)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)