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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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。

局部变量是在某一函数内定义的变量,有效区域在本函数里。
全局变量定义在函数外,全局起作用。
参考技术A 是局部变量啊= =全局变量是在函数值外定义的变量【包括主函数、所以在main函数中定义的变量也是局部变量 参考技术B 局部变量是在某一函数内定义的变量,有效区域在本函数里。
全局变量定义在函数外,全局起作用。
参考技术C

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

参考技术D 你这个问题我没有重现 但是大概问题出在哪我提两点想法
你的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'的

本回答被提问者采纳

C语言局部变量与全局变量重名时的优先级问题(当局部变量和全局变量同时存在的时候,优先引用局部变量,而不去引用全局变量)

当局部变量和全局变量同时存在的时候,优先引用局部变量,而不去引用全局变量。

参考文章:全局变量与局部变量优先级调用的问题—C/C++程序基础(二)

以上是关于C语言中的全局变量和局部变量的主要内容,如果未能解决你的问题,请参考以下文章

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

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

C语言中,局部变量和全局变量的问题

C语言基础:作用域规则(局部变量,全局变量,形式参数)全局变量与局部变量在内存中的区别初始化局部变量和全局变量

☀️光天化日学C语言☀️(35)- 局部变量和全局变量

C语言中的 局部变量,存储在啥地方?