1.示例代码

#include <stdio.h>char * str1()
{char A[] = "Hello!";return A;
}
char * str2()
{char A[] = "Hello!";char *p;p = A;return p;
}
char * str3()
{   char A[1024] = "Hello!";return A;
}
char * str4()
{char A[1024] = "Hello!";char *p;    p = A;return p;
}
char * str5()
{char A[1024] = "Hello!";char *p;A[1018] = 'h';A[1019] = 'e';A[1020] = 'l';A[1021] = 'l';A[1022] = 'o';A[1023] = '\0';p = A;p += 1018;return p;
}
char * str6()
{static char A[1024] = "Hello!";char *p;A[1018] = 'h';A[1019] = 'e';A[1020] = 'l';A[1021] = 'l';A[1022] = 'o';A[1023] = '\0';p = A;p += 1018;return p;
}
char * str7()
{char *p = "Hello!";return p;
}
char * str8()
{char A[1024*1009] = "Hello!";return A;
}void main()
{printf("str1:%s\n", str1());printf("str2:%s\n", str2());printf("str3:%s\n", str3());printf("str4:%s\n", str4());printf("str5:%s\n", str5());printf("str6:%s\n", str6());printf("str7:%s\n", str7());//printf("str8:%s\n", str8());
}

2.运行结果

3.结果分析

  • 函数str1()和str2()返回乱码,这是因为函数运行时函数参数和函数里面的局部变量是存放在栈(stack)中,当函数结束返回时栈也被系统回收,所以返回的数组或者指针所指向的地址数据已经被覆盖,为乱码;
            注:更多了解程序在内存的位置参考:http://blog.csdn.net/hairetz/article/details/4141043#reply
  • 函数str3()和str4()为什么可以正常返回呢,组数在栈中的数据在函数返回时没有被操作系统回收吗?这个问题的答案留在下面回答。
  • 函数str5()中从数组的A[1018]元素到A[1023]元素分开赋值,然后指针P指到数组的A[1018]元素返回,打印结果乱码;
  • 函数str6()与str5()不同之处在于在声明数组A[]的时候加上static关键字,这表明数组中的数据不再存放在内存中的栈而是存放在静态变量区和全局变量放在一个区域,只有在程序运行结束后系统才会回收,所以可以正常返回;
那么为啥函数str3()和str4()可以正常返回数组结果,str5()不可以呢,这是因为,他们三个函数中的数组都存放在内存中的栈中,只是因为数组设置的比较大为1024,当存放的是小数组“Hello!”时候可以返回是因为内存没有被完全覆盖,而在函数str5()中在数组的后面几个元素被覆盖了,所以输出乱码;这是偶然现象,如果在栈被回收后立马被完全利用,那么函数str3()和函数str4()返回的结果也会是乱码。
  • 为什么函数str7()可以正常返回字符串呢?这是因为声明的字符指针p存放在栈中,而“Hello!”存放在常量区,它在程序运行结束由操作系统回收,而指针p存放的是它的地址,在函数返回时候把它的地址返回给主函数,所以可以正确打印字符串。
  • 函数str8(),在主函数未调用,因为调用程序会出现栈溢出,程序会停止运行,可以看出这里的栈大小大约为1M Byte。

4.如何修改

  那么如何修改成程序使得函数可以返回数组,这里有以下几种方法:
  1. 如上面程序str6()中把数组声明为static 存放在静态变量区,但是这样存在内存泄漏,也可以通过malloc(C语言)或者new(C++)将数组声明在堆(heap)中,
            然后在函数使用完后free()或者delete内存;不过有可能存在在函数外面忘记释放内存的情况;
         2.通过指向数组的指针或者结构实现,参考:http://blog.csdn.net/zouxinfox/article/details/2525206
         3.建议使用把数组作为函数的形参传递进去,在调用函数的主函数声明数组,在使用完后释放数组,参考:http://www.cnblogs.com/yangxi/archive/2011/09/18/2180759.html

5. 思考

 在理解程序在内存中的存储情况,可以方便理解这个问题。
 附录一个写代码的规范:http://www.cnblogs.com/pmer/archive/2011/09/18/2180157.html

C语言 函数返回数组和指针区别相关推荐

  1. 关于C语言函数返回数组的问题【转】

    (转自:https://blog.csdn.net/earbao/article/details/53401800) 关于C语言函数返回一个数组 c语言中函数不能直接返回一个数组,但是可以用其他方式实 ...

  2. c语言在函数中返回数组,关于C语言函数返回数组的问题

    关于C语言函数返回一个数组 c语言中函数不能直接返回一个数组,但是可以用其他方式实现类似功能,不过需要注意: 1.该数组不能是返回函数的局部变量数组,因为局部变量数组在退出函数后会被释放. 可以是全局 ...

  3. c 语言 函数返回数组_如何在C ++函数中返回数组

    c 语言 函数返回数组 介绍 (Introduction) In this tutorial, we are going to understand how we can return an arra ...

  4. 关于C语言函数返回数组问题

    现象 int *test_fun2() {int array[10] = { 0 };int i = 0;for (i = 0; i < 10; i++){array[i] = 8;}retur ...

  5. c语言函数返回值存放数组,C语言函数返回数组

    C编程语言不允许返回整个数组作为函数的参数.但是,您也可以返回一个指针,没有索引到一个数组中指定数组的名称.你将学习在下一章节中,这样你就可以跳过这一章,直到你理解这个概念在C中的指针的指针 如果你想 ...

  6. c语言函数返回数组_C语言如何用一维数组拷贝函数,拷贝二位数组(C Primer Plus 10-7)...

    程序内容: 初始化一个double类型的二维数组,使用编程练习2中的一个拷贝函数把该数组中的数据拷贝至另一个二维数组. 程序为C Primer Plus第十章第七题的答案示例 附:程序代码为本人亲自编 ...

  7. matlab二重指针,VC++中函数返回数组指针或者带指针的结构体的编译方式是否可取? - 程序语言 - 小木虫 - 学术 科研 互动社区...

    libralibra 构造函数+析构函数应该是比较正规的做法吧, 你的结构体/类被提早释放的问题,是不是那个结构体是局部变量,当超出作用域时对象被销毁,如果存在析构函数,会被默认调用, 如果你返回结构 ...

  8. c语言函数输出数组,如何让C语言函数返回一个二维数组

    为了让C语言函数返回一个二维数组,有些人这样定义函数: int **foo(int rows, int columns) 然后在函数中费劲心机拼出来一个这样的malloc语句: int (*resul ...

  9. c语言中自定义函数返回数组,C语言自定义函数返回数组的方法(图文详解)

    C语言自定义函数返回数组的方法(图文详解) 最近看到一些同学问题,有提到说:如何在一个函数中返回数组呢? 能否直接在自定义 函数中,写成char *类型返回值,直接返回呢?,代码如下: 直接返回str ...

最新文章

  1. 一个注解搞定接口防刷!还有谁不会?
  2. javascript检测对象中是否存在某个属性判断方法小结
  3. (android硬件应用实战)摄像头拍照实现和总结
  4. 自动生成想“变”就“变”
  5. linux落字效果代码,Shell中实现飞行文字效果
  6. 计算机科学导论第二章,补基础:自学:计算机科学导论 第二章 数字系统
  7. iOS cocos2d 2游戏开发实战(第3版)---你的第一个游戏!
  8. OpenCV均值漂移meanshift algorithm算法的实例(附完整代码)
  9. 高斯模糊java代码_OpenCV3 Java图形图像上的高斯模糊(Imgproc.GaussianBlur)
  10. hp-ux锁定用户密码_UX设计101:用户研究-入门需要了解的一切
  11. VB 打开文件夹,并选中指定的文件
  12. 帮助小明翻译他的编程语言
  13. 自然语言处理 -- NLP作业 1 :训练词向量
  14. Java Web - 笔记(1)
  15. Java面试题视频讲解汇总,持续更新中...
  16. 税控盘版开票助手开发
  17. sis地址发布器_Android Studio 3.6 正式版终于发布了,快来围观
  18. C#联合halcon实现字符缺陷检测源码 机器视觉 字符识别 4个巴斯勒相机SDK开发 pin测量 io输入输出
  19. 分享给学弟学妹们的一些成为全栈工程师的方向和方法
  20. 记录一篇w10下最新tensorflow2.3的安装包括anaconda,cuda,cudnn安装,配置环境

热门文章

  1. c语言点滴 书签 pdf,C语言程序设计(详细书签)文字版.pdf
  2. 大数据-案例-离线数仓-电商:【MySQL(业务)-ETL(Kettle)】+【前端JS埋点->日志->Flume->HDFS->ETL(SparkRDD)】->Hive数仓->MySQL->可视化
  3. python调用origin画图_Python科学绘图
  4. arduino使用 iic协议控制16路pmw板的扩展
  5. python下socket阻塞(setblocking)、超时(settimeout)探讨
  6. qq同步android 2.2,QQ同步助手Android2.0版发布
  7. Android应用开发--MP3音乐播放器Service实现
  8. magnolia的介绍
  9. 爱奇艺数据库选型最佳实干--实操篇
  10. Sketchup 打开“大纲视图”