C语言函数不能返回局部变量的地址

在C中,正常情况下,我们只能从函数中返回一个值。但在很多情况下,我们需要从函数中返回多个值,此时使用数组或指针能够很好地完成这样的任务。这里是一个示例。这个程序使用一个整型数组作为参数,并将数组元素的和与积返回给调用函数。下面是C代码,这是一种常见情况。下面给出实现技巧:
  
  
  1. #include <stdio.h> 
  2. #include <conio.h> 
  3. int* Pool(int array[],int size)  
  4. {  
  5.    int *x;  
  6.    int i=0;  
  7.    int a[2]={0,1};  
  8.    for(i=0;i<size;i++)  
  9.    {  
  10.       a[0]+=array[i];                       //存储数组元素值的和  
  11.       a[1]*=array[i];                       //存储数组元素值的积  
  12.    }  
  13.    //将数组的基地址赋值给整型指针  
  14.    x=&a[0];  
  15.    //返回整个数组  
  16.    return x;  
  17. }  
  18.  
  19. int main()  
  20. {  
  21.    int a[]={1,2,3,4};  
  22.    int *c; c = Pool(a,4);  
  23.    printf("Sum = %d\nProduct = %d\n",c[0],c[1]);  
  24.    getch();  
  25.    return 0;  

这样,你已经学会了如何使用数组和指针从C函数中返回多个值。在很多情况下你会发现这个技巧很有用。

其实上面的用法是有问题的,在C语言中绝不能返回函数内局部变量的地址。

在c语言中,一种典型的错误就是将一个指向局部变量的指针作为函数的返回值。由于该数组是局部变量,因此在函数返回时其数组空间已经作废了,即指针应用一块无意义的地址空间,所以不会有返回值。

如果得到正常的值,只能是幸运的

退出函数的时候,系统只是修改了栈顶的指针,并没有清内存;
所以,是有可能正常访问到局部变量的内存的。
但因为栈是系统自动管理的,所以该内存可能会被分配给其他函数,这样,该内存的内容就会被覆盖;不再是原来的值了。

  1. int main()  
  2. {  
  3.    int a[]={1,2,3,4};  
  4.    int *c; c = Pool(a,4);  
  5.   Pool(a,3);  //增加这句
  6.    printf("Sum = %d\nProduct = %d\n",c[0],c[1]);  
  7.    getch();  
  8.    return 0;  

得到的结果跟上面就不一样了


局部变量是不能从外部访问的,因为局部变量只有在被调用时才会存在于内存中(具体地说是在运行时栈中),当函数被调用时,运行时栈在顶端为被调用函数分配一个临时栈帧,调用函数中声明的所有变量都在临时栈帧中分配相应的内存,当函数返回时,运行时栈弹出顶端栈帧(也就是被调用的那个函数的),因此所有局部变量作废,而后程序继续运行,运行时栈不断变化,而函数返回指针指向的内存单元就会不断变化,显示乱码很正常。
而当在函数中用static声明变量时,编译器用另一种机制对待此变量(静态变量),编译器在生成的目标文件中给静态变量分配符号表,并附有附属信息(控制访问),并且会分配相应的内存单元,也就是说固定的地址,存在于内存映像中的.data段,而不是在函数调用时再在临时栈帧中分配内存,因此可以全局引用,当然必须有正确的访问权限。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值