欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

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

发布时间:2023/12/15 编程问答 54 豆豆
生活随笔 收集整理的这篇文章主要介绍了 C语言函数不能返回局部变量的地址 小编觉得挺不错的,现在分享给大家,帮大家做个参考.
在C中,正常情况下,我们只能从函数中返回一个值。但在很多情况下,我们需要从函数中返回多个值,此时使用数组或指针能够很好地完成这样的任务。这里是一个示例。这个程序使用一个整型数组作为参数,并将数组元素的和与积返回给调用函数。下面是C代码,这是一种常见情况。下面给出实现技巧:
  • #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语言函数不能返回局部变量的地址的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。