>第 3 章 简单函数>局部变量与全局变量

syfeagle syfeagle@hotmail.com http://learn.akae.cn/media/ch03s04.html
2009-05-26 11:22:12

例 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,不知道是为什么?




syfeagle syfeagle@hotmail.com
2009-05-26 11:27:42

#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


宋劲杉 songjinshan@akaedu.org
2009-06-15 10:57:42

返回值应该是void,谢谢指出!打印出来的结果是随机值,是777也正常,不是777也正常。


Laciq 530107999@qq.com
2009-06-21 12:45:02

只要是一个块,就有作用域。
例如选择语句与循环语句
Such as:
int num = 4;

if (a > b) {
       int num = 5;
       
       c = num + 5;
}


尹志伟 zhiweiyin1985@gmail.com
2009-08-10 09:19:19

我觉得您对局部变量“初值不确定”的解释很好很全面,但是希望能明确告诉初学者有些教材是不准确的、不全面的。
我刚学C语言的时候,不知道哪本书上说“全局变量默认初始为0,局部变量默认初始为随机值”。我觉得这个随机值说的简单,但是很容易让人误解。很长一段时间内,我都以为局部变量的初值真的是个很随机的数值(甚至还想过可以利用这个方法做随机数……)。后来慢慢的发现,这些数并没有那么“随机”,再后来了解了您书中说的问题,很是不易啊。


net1999 hhc@newclass.com.cn
2009-08-10 10:24:29

#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。


宋劲杉 songjinshan@akaedu.org
2009-08-12 22:51:35

本书没有采用“随机值”这样的说法,只是说“不确定”。至于道理是什么,这一章说了,等学到例 19.1 “研究函数的调用过程”就能解释这些现象了。所以在这里不要胡乱理解。


李海 lihai136722336@sina.com
2010-03-30 13:44:25

#include<stdio.h>
int main(void)
{
	void print_time(int, int);
	print_time(23, 59);
	return 0;
}
能行吗?
undefined reference to 'print_time'


C-Language の初心者 qq348298955@yahoo.cn
2010-05-09 21:44:20

#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;
}
望指点------------


宋劲杉 songjinshan@gmail.com
2010-05-11 08:22:01

当然不能正常显示,你再多打一次试试

void main(void)
{
	ini('t');
	printf("p_char-----:%c\n",*p_char);
	printf("p_char-----:%c\n",*p_char);
	return 0;
}


赵广兴 guangxingzhao@gmail.com http://www.xingxingjia.com/
2010-07-14 08:14:22

倒数第五行

这样声明的标识符print_time具有局部作域


宋劲杉 songjinshan@gmail.com
2010-07-14 16:11:41

谢谢指出!想不到我看了这么多遍,出版这么久了,还有这样的错误没被发现。


如果您有建设性意见,哪怕只是纠正一个错别字,也请不吝赐教,您留下的姓名和email将会出现在本书前言的致谢中。再次感谢您的宝贵意见!