c语言函数中,结构体变量的地址可以返回,怎么普通变量的地址不...
发布网友
发布时间:2024-02-23 17:06
我来回答
共5个回答
热心网友
时间:2024-04-09 18:40
不太同意楼上观点,的确,当函数结束时会释放局部变量,但是,当你将它的地址返回时,系统就不会释放该变量。可参考链表的创建过程,我们都是在子函数中创建空链表,然后将其地址返回,如果返回了该地址,程序还释放局部变量,那么,空链表岂不是无法创建?而且楼主的那个例2我编译了,可以正常返回的啊…
热心网友
时间:2024-04-09 18:39
这是编译器的优化。程序1,程序2都可以返回。但是当你直接写return &x;的时候,编译器就会提示你返回局部变量 地址
热心网友
时间:2024-04-09 18:48
应该都不行,都是局部变量,fun()一结束都没了。
ST * fun(ST x) //这里的参数是x主函数里y的一个拷贝
{ST * px;
x.a=100;x.b='C';px=&x; //改变的是备份的值,并不是主函数里的y
printf("x.a=%d x.b=%c\n",x.a,x.b);
return px; //函数退出后,x被释放,px指向的空间里装的不知道是什么。但是整个程序并没有语法上的错误
}
热心网友
时间:2024-04-09 18:42
例2是一个错误的程序
错误1:
int * fun(x)
编译器编译的时候不会知道x是什么,函数的参数列表在函数声明的时候需要参数的类型,所以这里要修改成: int * fun(int x)
改写后在VC++6.0里面可以运行。
错误2:
就算改写了,这个fun函数也没什么用,为什么呢?
因为fun函数接受的是int变量a的数值9的一个拷贝,这个拷贝放在一个临时的内存位置处,然后通过调用fun(a)把这个临时的数值传递给函数,结果函数用10替换了9,这真是费力不讨好
直接用
int * fun(void)
{
int *p,x=10;
p=&x;
return p;
}
就可以了。
PS:在退出函数fun后,还能访问x,这是为什么呢?
热心网友
时间:2024-04-09 18:39
可能是编译器的问题,例2的形参没有类型,在有些编译器是通过的,有些就会出现问题