C语言函数不能返回局部变量的地址
2012-06-05 23:22
281 查看
在C中,正常情况下,我们只能从函数中返回一个值。但在很多情况下,我们需要从函数中返回多个值,此时使用数组或指针能够很好地完成这样的任务。这里是一个示例。这个程序使用一个整型数组作为参数,并将数组元素的和与积返回给调用函数。下面是C代码,这是一种常见情况。下面给出实现技巧:
这样,你已经学会了如何使用数组和指针从C函数中返回多个值。在很多情况下你会发现这个技巧很有用。
其实上面的用法是有问题的,在C语言中绝不能返回函数内局部变量的地址。
在c语言中,一种典型的错误就是将一个指向局部变量的指针作为函数的返回值。由于该数组是局部变量,因此在函数返回时其数组空间已经作废了,即指针应用一块无意义的地址空间,所以不会有返回值。
如果得到正常的值,只能是幸运的
退出函数的时候,系统只是修改了栈顶的指针,并没有清内存;
所以,是有可能正常访问到局部变量的内存的。
但因为栈是系统自动管理的,所以该内存可能会被分配给其他函数,这样,该内存的内容就会被覆盖;不再是原来的值了。
int main()
{
int a[]={1,2,3,4};
int *c; c = Pool(a,4);
Pool(a,3); //增加这句
printf("Sum = %d\nProduct = %d\n",c[0],c[1]);
getch();
return 0;
}
得到的结果跟上面就不一样了
#include <stdio.h> #include <conio.h> int* Pool(int array[],int size) { int *x; int i=0; int a[2]={0,1}; for(i=0;i<size;i++) { a[0]+=array[i]; //存储数组元素值的和 a[1]*=array[i]; //存储数组元素值的积 } //将数组的基地址赋值给整型指针 x=&a[0]; //返回整个数组 return x; } int main() { int a[]={1,2,3,4}; int *c; c = Pool(a,4); printf("Sum = %d\nProduct = %d\n",c[0],c[1]); getch(); return 0; }
这样,你已经学会了如何使用数组和指针从C函数中返回多个值。在很多情况下你会发现这个技巧很有用。
其实上面的用法是有问题的,在C语言中绝不能返回函数内局部变量的地址。
在c语言中,一种典型的错误就是将一个指向局部变量的指针作为函数的返回值。由于该数组是局部变量,因此在函数返回时其数组空间已经作废了,即指针应用一块无意义的地址空间,所以不会有返回值。
如果得到正常的值,只能是幸运的
退出函数的时候,系统只是修改了栈顶的指针,并没有清内存;
所以,是有可能正常访问到局部变量的内存的。
但因为栈是系统自动管理的,所以该内存可能会被分配给其他函数,这样,该内存的内容就会被覆盖;不再是原来的值了。
int main()
{
int a[]={1,2,3,4};
int *c; c = Pool(a,4);
Pool(a,3); //增加这句
printf("Sum = %d\nProduct = %d\n",c[0],c[1]);
getch();
return 0;
}
得到的结果跟上面就不一样了
相关文章推荐
- C语言函数不能返回局部变量的地址
- Android 解决Map根据地址返回经纬度方法getFromLocationName()不能正常执行
- 栈内存的临时性不能返回局部变量地址
- C++关于不能返回局部变量的指针的研究
- 有关指针函数不可以返回局部变量的地址的三种解决方法
- C语言--返回局部变量的地址
- 现在有一个城市销售经理,需要从公司出发,去拜访市内的商家,已知他的位置以及商家的位置,但是由于城市道路交通的原因,他只能在左右中选择一个方向,在上下中选择一个方向,现在问他有多少种方案到达商家地址。给定一个地图map及它的长宽n和m,其中1代表经理位置,2代表商家位置,-1代表不能经过的地区,0代表可以经过的地区,请返回方案数,保证一定存在合法路径。保证矩阵的长宽都小于等于10。
- 不能返回局部变量的引用
- 返回局部变量或临时变量的地址的问题
- C语言学习7 :二级指针定义,强制转换,多级指针初步,6级指针构造,错误应用*p=&a,错误应用 二级p2,void型指针的兼容性,malloc函数基本用法,malloc分配空间和堆栈空间的区别,验证malloc函数内存的分配,验证malloc函数的越界,内存泄漏,指针不能返回局部变量地址,内存分配
- 千万不能返回局部变量的引用??
- 注意不要返回局部变量的地址
- 不能返回局部变量的引用
- 返回局部变量的地址
- C基础----返回局部变量的地址&栈(linux)
- C语言--返回局部变量的地址
- 如果从函数中返回局部变量的地址,引用或者指针的形式,则变量类型必须是静态的或者常量,即不在栈中存储
- 写一个返回字符串长度的函数,函数里面不用局部变量,不能调用系统函数strlen
- C语言--返回局部变量的地址
- 编译器警告(级别1) C4172 返回局部变量或临时对象的地址