在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. int main()
  19. {
  20. int a[]={1,2,3,4};
  21. int *c; c = Pool(a,4);
  22. printf("Sum = %d\nProduct = %d\n",c[0],c[1]);
  23. getch();
  24. return 0;
  25. }

这样,你已经学会了如何使用数组和指针从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;
  9. }

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

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

  1. 为什么C语言函数不能返回数组,却可以返回结构体?

    C语言函数为什么不能返回数组? 在C语言程序开发中,我们不可以编写下面这样的代码: char f(void)[8] { char ret; // ...fill... return ret; } in ...

  2. 为什么C语言函数不能返回数组,却可以返回结构体

    C语言函数为什么不能返回数组? 在C语言程序开发中,我们不可以编写下面这样的代码: char f(void[8]{ char ret;// ...fill... return ret; }int ma ...

  3. c语言的函数中局部变量可以return吗,C语言--返回局部变量的地址

    我们可能会经常写出这样的代码: int  add(int  a , int  b) { return  a + b; } 当然,这是合理的写法,使函数的返回值为 int ,所以,调用函数后会返回一个i ...

  4. C语言--返回局部变量的地址

    我们可能会经常写出这样的代码: int  add(int  a , int  b) { return  a + b; } 当然,这是合理的写法,使函数的返回值为 int ,所以,调用函数后会返回一个i ...

  5. C语言函数如何返回数组

    文章目录 一.静态数组和动态数组 1.静态数组的缺点 2.动态内存分配与动态数组 2.1 动态内存分配 2.2 动态数组 2.3 内存与堆与栈 二.自定义函数返回数组 1.常见错误 2.返回数组的函数 ...

  6. c语言 电梯调度,c语言函数如何返回两个值或多个值(结合 小飞 电梯调度算法)...

    正常思维:使用return 语句,但每调用一次函数 return 语句只能返回一个值 .这是C语言语法规则. 该怎么实现一个函数返回两个值或是多个值?,可以采用"间接方法".大概有 ...

  7. C语言函数传递方式-值传递和地址传递

    C语言函数传递方式 值传递 定义 所谓的值传递,顾名思义就是使用变量.常量.数组等作为函数的参数.实际是将实参的值复制到形参相应的存储单元中,即形参和实参分别占用不同的存储单元. 特点 值传递的特点是 ...

  8. c语言函数默认返回类型

    函数返回类型是你定义函数时自己决定的,默认为int型 C语言函数格式为: <类型名> <函数名>(形参1,形参2--) 类型名就决定了返回类型,如果没有明确写出返回类型的话,默 ...

  9. C语言函数如何返回字符串

    有些时候我们需要函数返回一个字符串但是总不能定义一个字符串函数吧?所以,这里介绍几种方法让函数返回字符串. 方法一:全局变量 全局变量是最简单的方法,如例子: #include <stdio.h ...

最新文章

  1. 一身漏洞狂奔24年!人人都用的WiFi被曝重大漏洞,随时成为监控你的工具
  2. NeHe教程Qt实现——lesson12
  3. 厉害了黑科技,动态安全下的防拖库原来可以这么简单!
  4. boost::geometry::segment_view用法的测试程序
  5. DIY一个高大上带提醒的计时器,简单实用,你还在等什么
  6. mybatis 配置错误 XML document structures must start and end within the same entity
  7. WinSock API网络编程——TCP/IP协议详解
  8. java解析json数组
  9. 系统无法安装High Definition Audio的UAA总线驱动程序之解决方法
  10. PHP学习笔记二(面向对象和表单)
  11. data标签怎么爬虫_scrapy爬虫笔记(1):scrapy基本使用
  12. 实力封装:Unity打包AssetBundle(三)
  13. Java通过 JDBC 连接数据库操作
  14. Idea快捷键大全(比较全的)
  15. 数据分析新手小白入门学习指南,这五大知识清单值得收藏
  16. [转载]Spring zuul日志配置
  17. mysql 表分区 排序_mysql 表分区
  18. 【学习点滴】linux调试工具、cmake和网络抓包
  19. css情景动画,CSS3 白天/黑夜场景轮回动画
  20. MYSQL相关内容(引擎、隔离级别、实现原理)

热门文章

  1. linux公社 java算法_Java快速排序算法
  2. 区块链不适用的若干场景
  3. java 泛型详解、Java中的泛型方法、 java泛型详解
  4. Red Hat Linux 5.4 开启xdm远程访问
  5. Apache配置(转载)
  6. HDU 1176 免费馅饼
  7. laravel 定时任务
  8. xslt三种带图片的超链接(a标签,img标签)写法
  9. Javascript 解析,格式化日期
  10. php直接的模块接口,api(接口)模块