int* asd(int* a)//返回之后m和a不是会被释放掉吗?为什么VC不报警?
{
int m=1;
a=&m;
return a;
}
int* zxc()//这个VC倒会报警
{
int n[64];
return n;
}
void main()
{
static int *b;
int *c;
c=asd(b);
printf("%d",*c);
}
变量、指针生命周期问题!
答案:3 悬赏:10 手机版
解决时间 2021-03-21 03:35
- 提问者网友:星軌
- 2021-03-20 19:34
最佳答案
- 五星知识达人网友:时间的尘埃
- 2021-03-20 19:42
楼主说的没错,本质上两个都是把临时变量的地址作为返回值返回.但差别在于第一个是间接返回(指针指向一个栈上地址),第二个是直接返回(栈上数组的首地址).两种情况返回的指针使用都将导致未知结果,甚至崩溃.
VC编译的时候不能侦测到间接返回地址的来源是否有问题,因为编译不能确定指针指向的内容是否有效.你的这个例子情况比较简单,如果一个复杂的函数让编译器检测间接返回临时地址就比较困难了.(编译器的难题)
当直接返回是可以被编译器一眼看出来的.所以VC提示警告.
VC编译的时候不能侦测到间接返回地址的来源是否有问题,因为编译不能确定指针指向的内容是否有效.你的这个例子情况比较简单,如果一个复杂的函数让编译器检测间接返回临时地址就比较困难了.(编译器的难题)
当直接返回是可以被编译器一眼看出来的.所以VC提示警告.
全部回答
- 1楼网友:玩家
- 2021-03-20 21:34
指针变量跟整形变量是差不多的概念,例如int *p 。p是一个指针变量,int i,i是一个整形变量。
而变量指针是指:高级编程语言里都是通过变量来管理软件运行时内存中的变量数据,并不直接提供这个变量在虚拟内存中居体的位置,这里我们可以使用一些手段,得到一个变量在虚拟内存中的位置,可以把这个位置称为变量指针
- 2楼网友:人间朝暮
- 2021-03-20 20:27
第一种情况VC怎么会要报警呢?
返回一个栈上的指针变量是可以的,返回的时候会自动拷贝a的值然后再释放a和m。
而且即使a和m已经释放。函数返回地址的值任然可以是1(这是因为还没有其它函数使用该函数的栈,所以栈上的数据不会改变。不过这会导致很多未知错误,所以一般编程不会这么做)
而第二个肯定会报警啊。
n既不是变量也不是常量,只是一个数组标识符,怎么能做返回值呢???
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯