函数返回值为数组

首先先看一个返回值为数组的类子:

#include<stdio.h>

  1. #define N 5
  2. int *print()
  3. {
  4. int a[N];
  5. int i;
  6. for(i=0;i<N;i )
  7. a[i]=i;
  8. return a;
  9. }
  10. int main()
  11. {
  12. int *b,i;
  13. b=print();
  14. for(i=0;i<N;i )
  15. printf("%d\n",b[i]);
  16. return 0;
  17. }

这个类子就是一个函数返回数组,运行结果是错误的.原因在于: 在函数print()里面 ,数组a[N]是一个局部变量,当你函数执行完之后,会自动释放其空间,所以 return a这句只是返回了一个指向数组a[N]的地值.而在主函数中,b应该接收的是数组a[N]的地址(即数组本身的地址),而它所占用的空间随着函数的调用完毕也随之被释放掉了,所以得到的答案是不正确的.

就函数的返回值是数组而言,经过底下的两种修改,会得到正确答案,代码如下:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define N 5
  4. int *print()
  5. {
  6. static int a[N];
  7. int i;
  8. for(i=0;i<N;i )
  9. a[i]=i;
  10. return a;
  11. }
  12. int *print1()
  13. {
  14. int *a;
  15. int i;
  16. a=(int *)malloc(N);
  17. for(i=0;i<N;i )
  18. {
  19. a[i]=i;
  20. }
  21. return a;
  22. }
  23. int main()
  24. {
  25. int *b;
  26. //    int b[N];
  27. int i;
  28. b=print1();
  29. for(i=0;i<N;i )
  30. printf("%d\n",b[i]);
  31. return 0;
  32. }

无论是调用print()函数还是调用print1()函数都能得到正确结果.原因如下

调用print()函数:

在数组a[N]前面加入了static关键字,它就使得a[N]存放在内存中的静态存储区中,所占用的存储单元不释放直到整个整个程序运行结束.所以当主函数调用完print()函数后,该空间依然存在.所以main()函数中b指针接收到这个数组的首地值后可以访问数组中的元素.

调用print1()函数:

把数组a[N]换为指针*a,再给这个指针申请空间,也可以正常运行.因为当给指针a申请空间时,给指针分配的空间在堆上,堆上的空间是由程序员自动给予分配和释放的.若程序员不释放,程序结束时可能由OS释放.所以main函数中b指针也可以接收到这段空间的首地值,得到正确的答案.

当把main函数中的 int *b注释掉 换成int b[N] 会出现错误

test.c:30: warning: assignment makes integer from pointer without a cast

或者test.c:30: error: incompatible types when assigning to type ‘int[5]’ from type ‘int *’

都不能得到正确结果,原因如下:

main函数中 b得到的返回值是该数组的首地值,如果是*b,就是指针b指向这个数组的首地值,使指针变量向后移动就可以访问该数组中的所有元素.  而如果是b[N]的话,相当于编译器在栈上给数组b[N]分配了N个int空间,所以b指向a的首地值,不能通过这个地址,修改其自身申请的值.只能通过一个指针通过这个首地值,让指针向后移动来访问源数据.而且因为b没有进行初始化,所以得到的是随机值.

后记:

编写这个的目的只是想通过返回值了解这些知识,当然,这种实现,形参是最好的选择.

时间: 2024-10-13 01:47:33

函数返回值为数组的相关文章

函数指针,函数指针数组,函数返回值为函数指针

函数的名字就是函数的首地址:定义函数指针; int (*p)(int ) p为函数指针变量名字,int 为函数的返回值类型为int型:(int)为函数的形参类型为int型, 注:因为优先级所以要用(*p),否则就会p先和后面的()结合为int*p(int),意思就变为p(int)函数的返回值为int* 注:main2()函数中   int (*p[])(int ,int )  为一维数组,下面写错了, #include<stdio.h> #include<stdlib.h> int

C语言的函数返回值

一:背景 谈到C语言的函数返回值,可能会感觉很亲切,不就是一个函数返回值嘛,当初学C语言的时候早就学过了很easy嘛,我曾经也是这么想的.后来要上研究生了,研究生阶段搞得就是C,所以又重新开始学习C,学习C的过程中遇到了很多问题,在此博客中一一记录.实际过程中遇到的第一个问题自然就是函数返回值了.如果有人问你在一个函数中声明一个字符串数组,最后再return这个数组.这可以实现嘛?如果是问我我可能会毫不犹豫的说OK.那事实呢?由此本文诞生了...... 二:问题 先看几个实际的例子: #incl

const 小结: 做函数参数,做函数返回值,以及const函数

做函数参数 : 例如 fun(const int * i)参数i的值不能在fun()函数执行的过程中被修改,它将一直保持调用此函数时传入的值.如果试图修改i值的语句在fun()函数中出现,将导致程序无法编译,这样对参数i起到保护作用. 注:const 通常用来限制函数的指针参数,引用和数组参数,而一般形式的参数因为形参和实参本不是同一内存单元的变量,所以对形参的修改不会影响实参,因此也没有必要限制函数体不能对参数进行修改.  做函数返回值 : 函数返回值为 const 只有用在函数返回为引用的情

初级函数返回值

返回值 什么是函数返回值:函数执行后的结果外部需要使用的时候,我们不能直接给予,是需要通过return返回. 1.执行函数完毕之后,返回的数据 2.有return的函数就有返回值,反之则没有返回undefined 3.把函数内部的值赋值给外边 var j=fn(2,3); console.log(j); function fn(a,b) { var c=a+b; // 如果我们想把函数内部的值赋值给外部,必须使用return; //如果没有return或则return没有值,函数返回undefi

C语言中函数返回值的问题

c语言中有关于在函数返回值的问题,在函数中的局部变量主要是在栈上开辟的,出了函数变量就被回收了,针对函数返回值得问题,给出下面几个比较具体的例子来说明: 函数返回值是在函数中定义的局部变量 这类型的返回值在主函数中是可以使用的,因为返回局部变量值得时候,返回的是值得一个副本,而在主函数中我们需要的也只是这个值而已,因此是可以的,例如 int fun(char *arr) { int num = 0; while (*arr != '\\0') { num = num * 10 + *arr -

函数返回值问题

函数返回值问题 来源于http://blog.csdn.net/lwbeyond/article/details/7083619 程序1: [cpp] view plain copy #include <stdio.h> char *returnStr() { char *p="hello world!"; return p; } int main() { char *str; str=returnStr(); printf("%s\n", str);

C语言函数返回值和变量类型

前言 最近在刷题,在写矩阵的快速幂的题时,对于返回值是数组的程序,写的十分冗杂.借此机会,重新梳理下C语言中函数的返回值与变量类型的关系. 按照变量的寿命,可以分为三种类型 1.静态变量 寿命从程序开始运行,到程序关闭结束  储存在静态储存区中 2.自动变量 寿命从声明该变量的语句块到结束为止  储存在栈中,系统自动释放 3.通过malloc()分配的 寿命直到free()为止  储存在堆中,由用户自主释放 函数的返回值 之前自己有写过一个关于迷宫的demo,但是总是调试出错,请教别人后发现,自

以函数返回值做参数时,函数调用的顺序

环境:vs2013 在下面的代码中 1 //类似于下面的代码 2 3 foo(char*,char*,char*); 4 5 char* str ="A#B#C"; 6 7 foo(strtok(str,"#"),strtok(NULL,"#"),strtok(NULL,"#")); 预计让函数foo得到("A","B","C")的参数,程序编译的时候没问题,但是运行

函数指针与指针函数返回值的区别

指针函数是指带指针的函数,即本质是一个函数.函数返回类型是某一类型的指针定义: 类型标识符 *函数名(参数表)eg: int *f(x,y);函数指针是指向函数的指针变量,即本质是一个指针变量.int (*f) (int x); /* 声明一个函数指针 */ f=func; /* 将func函数的首地址赋给指针f */ 函数指针与指针函数返回值的区别,码迷,mamicode.com