C语言中的全局变量和局部变量

char s[5];

int main()
{
int flag;

printf("Enter data: ");
for (flag = 1; flag==1;)
{
scanf("%s",&s);
if (strlen(s)>5)
{printf("Error, exceeding data length! Please enter again: ");}
else
{flag=0;}
}
puts(s);}

当我把变量s 在 main 函数中申明的时候,
运行程序:除了输入刚好5个字符时,跳出 runtime check fail 什么什么的错误外。输入任意个数的字符 程序都能正常运行。

如上图,我把变量s 作为全局函数申明的时候。就没有这个错误。

这是为什么, 什么原理? 编译环境:vs2012。

局部变量是在某一函数内定义的变量,有效区域在本函数里。
全局变量定义在函数外,全局起作用。
温馨提示:内容为网友见解,仅供参考
第1个回答  2014-07-10
是局部变量啊= =全局变量是在函数值外定义的变量【包括主函数、所以在main函数中定义的变量也是局部变量
第2个回答  2019-06-18
局部变量是在某一函数内定义的变量,有效区域在本函数里。
全局变量定义在函数外,全局起作用。
第3个回答  2014-07-10

运行了一下,程序没有问题啊

第4个回答  推荐于2016-07-29
你这个问题我没有重现 但是大概问题出在哪我提两点想法
你的s只有5位长,而当你输入一个字符串的时候实际是将这个字符串赋值给s并且在后面加上'\0'的结束符,所以你输入 n长度的字符串其实是需要n+1长度的字符串来接的。当你输入5位的字符串的时候你的s已经发生溢出了,你试着将s[5]改为s[6]。
而全局变量和局部变量是不同的 存储的空间不同 具体为什么全局变量可以我也不清楚 但是可以肯定 出现这样的差别一定是你的代码有问题

空号一号 所说的&s的问题是对的。你写成&s其实就是没有理解数组就是指针的概念。但是这个问题又不是问题 因为对于数组来说 s和 &s是同一个值 你不信可以printf("s=%p &s=%p", s, &s);试试,但是如果s是指针就不一样了追问

谢谢你的回答。果真是因为没有考虑到\0。

可是。函数中,我已经设置了strlen>5时重来。
是不是strlen函数不计算\0???

关于scanf 我用了&,我是故意的。当时程序莫名出错,那是我绝望中胡乱尝试的改变。运行后没变化所以我就没改回来了。不过谢谢提醒。

追答

嗯 strlen是不会计算'\0'的

本回答被提问者采纳
相似回答