一段C语言代码!

来源:百度知道 编辑:UC知道 时间:2024/06/25 07:01:17
现在有一段代码

#include <stdio.h>
#include <stdlib.h>
typedef struct student
{
int number; //学号
int age; //年龄
} student;
student * getStudent()
{
student stu;
stu.age = 100; //年龄默认初始为岁
stu.number = 100; //学号默认初始为号
return &stu;
}
void main()
{
student * ptr = getStudent();

int age = ptr->age, number = ptr->number;
printf("student %d is %d .\n",number,age);

age = ptr->age, number = ptr->number;
printf("student %d is %d .\n",number, age);
}

那位可以帮我解释一下问什么两个输出结果不一样?

你的这个问题问的真好。

在c中,变量一般有两种存放的地方,一个是堆,一个是栈。放在堆上的是不会因为子函数的结束而自动释放空间,而在栈上,这里你可以理解为临时租用的空间,一旦子函数结束,马上释放。当然了,并不是堆就比栈什么都好,对栈的操作会比堆要块。

你的student stu;是在一个函数中定义的他是局部变量,在c 中,局部变量被存储在栈上,全部变量被存储在堆上。 你在主函数中调用子函数,子函数马上释放租用的空间。注意这里的释放,并不是把租用空间里头的东西清没了,它只是释放对空间占用的权力。下一次的数据在此之上覆盖。

所以上面的几个大虾都说你这个程序很走运,就是这个原因,恰巧你的程序在运行到第一printf的时候还没有谁去使用栈上这部分先前被getstudent()子函数使用过的空间。所以运行正确。

接下来就不行了。其实你如果在第一个printf运行之前如果你还有一些代码。那么你第一个printf就非常可能运行不正确。

你去看看书上很多代码,特别是链表。对于结构体变量,大多是用动态分配内存的方式,也就是说把这个结构体存储到堆上,然后用free语句是释放你确认没用的空间。如果你想确定某个变量在子函数结束之外还有效,要么声明为全局的,妖媚采用动态分配内存方式。

静态分配内存也就是在编译的时候就分配好了。而动态分配内存是在程序在运行过程中,遇到这样的动态分配语句才分配的。事先是没有分配好的。

:)

这段程序不出错算走运了。在getStudent函数中,返回的stu是一个局部变量,这个变量在运行该函数运行完毕后应该被删除了。所以之在访问这个变量,都是一次风险操作。

要得到正确的结果,要把stu定义为全局变量,或者这样写:
...getStudent()
{
student *stu = new student;
stu->age = 100;
...
return stu;
}

并在main最后加上:delete ptr;

student * getStudent() 这个函