例 3.7. 验证局部变量存储空间的分配和释放
这个例子原样我试了下,编译通不过
main.c: In function `foo':
main.c:8: warning: control reaches end of non-void function
int foo(void)
{
int i;
printf("%d\n", i);
i = 777;
}
改成void foo(void)后编译通过了,但是插入hello world 后还是777,不知道是为什么?
#include <stdio.h>
void foo(void)
{
int i;
printf("%d\n", i);
i = 777;
}
int main(void)
{
foo();
printf("hello world\n");
foo();
printf("hello world\n");
foo();
return 0;
}
编译后运行如下:
0
hello world
777
hello world
777
返回值应该是void,谢谢指出!打印出来的结果是随机值,是777也正常,不是777也正常。
只要是一个块,就有作用域。
例如选择语句与循环语句
Such as:
int num = 4;
if (a > b) {
int num = 5;
c = num + 5;
}我觉得您对局部变量“初值不确定”的解释很好很全面,但是希望能明确告诉初学者有些教材是不准确的、不全面的。 我刚学C语言的时候,不知道哪本书上说“全局变量默认初始为0,局部变量默认初始为随机值”。我觉得这个随机值说的简单,但是很容易让人误解。很长一段时间内,我都以为局部变量的初值真的是个很随机的数值(甚至还想过可以利用这个方法做随机数……)。后来慢慢的发现,这些数并没有那么“随机”,再后来了解了您书中说的问题,很是不易啊。
#include <stdio.h>
void foo(void)
{
int i;
printf("%d\n", i);
i = 777;
}
int main(void)
{
foo();
printf("hello world\n");
foo();
printf("hello world\n");
foo();
return 0;
}
运行结果:
0
hello world
0
hello world
0
我返回的结果是0,我理解的是:每次调用,都会是初始化变量,没有值就是0,所以没有777。本书没有采用“随机值”这样的说法,只是说“不确定”。至于道理是什么,这一章说了,等学到例 19.1 “研究函数的调用过程”就能解释这些现象了。所以在这里不要胡乱理解。
#include<stdio.h>
int main(void)
{
void print_time(int, int);
print_time(23, 59);
return 0;
}
能行吗?
undefined reference to 'print_time'#include <stdio.h>
char *p_char=NULL;
void ini(char tmp)
{
char temp; /*temp 离开作用域之后 内存应该被回收 是不是*/
temp=tmp;
p_char=&temp; /*这样使用 有什么不妥吗*/
}
void main(void)
{
ini('t');
printf("p_char-----:%c\n",*p_char); /*此处仍然可以正常显示 ? 怎么回事?*/
return 0;
}
望指点------------当然不能正常显示,你再多打一次试试
void main(void)
{
ini('t');
printf("p_char-----:%c\n",*p_char);
printf("p_char-----:%c\n",*p_char);
return 0;
}
倒数第五行 这样声明的标识符print_time具有局部作域
谢谢指出!想不到我看了这么多遍,出版这么久了,还有这样的错误没被发现。
如果您有建设性意见,哪怕只是纠正一个错别字,也请不吝赐教,您留下的姓名和email将会出现在本书前言的致谢中。再次感谢您的宝贵意见!