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

    (转自:https://blog.csdn.net/earbao/article/details/53401800

     

    关于C语言函数返回一个数组
    c语言中函数不能直接返回一个数组,但是可以用其他方式实现类似功能,不过需要注意:
    1、该数组不能是返回函数的局部变量数组,因为局部变量数组在退出函数后会被释放。
    可以是全局变量,静态局部变量,动态分配内存,以及从函数参数传过来的数组地址。
    2、返回指针时,无法返回长度,所以需要其它方式传回数组长度,以下是几种常用的方法。
    1) 约定固定长度;
    2) 以函数参数返回数组长度;
    3)将长度保存在全局变量中;
    4)约定数组结束标记;
    5)在数组中存储数组长度,如存在第一个元素中。
     

    有些时候需要子函数将一个数组返回出来,通常是两种方法,一种是靠指针,另一种是结构体。

    一、先来看依靠指针怎么做

     

    [cpp] view plain copy

    1. #include <stdio.h>  
    2. char *test(char *tmp)  
    3. {  
    4.     return tmp;  
    5. }  
    6. void main(void)  
    7. {  
    8.     printf("%s",test("第一个测试例子\n"));  
    9. }  

    二、使用结构体作为返回值来传递数组

     

    [cpp] view plain copy

    1. #include <stdio.h>  
    2. #include <stdlib.h>  
    3. #include <string.h>  
    4. #ifdef _WIN32  
    5. //#include <Windows.h>  
    6. #include <vld.h>  
    7. #endif  
    8.   
    9. //直接返回指针,但是无法返回长度  
    10. char *test(char *tmp)  
    11. {  
    12.     return tmp;  
    13. }  
    14.   
    15. //返回数组首地址  
    16. char *test2()  
    17. {  
    18.     //char tmp[30]="第一个测试例子\n";//错误写法,写成这样编译时弹出警告,最后的结果也是乱码  
    19.     char *tmp="test2 demo";//写成这样可以用指针返回数组首地址  
    20.     return tmp;  
    21. }  
    22. //使用静态全局变量  
    23. char *test3()  
    24. {  
    25.     //静态全局变量,但不是线程安全的,在多线程环境中就危险了  
    26.     static char tmp[30]="third demo test003";  
    27.     return tmp;  
    28. }  
    29.   
    30. //动态分配内存, 调用malloc在堆上分配内存,记得free  
    31. int* getArrays(int n)  
    32. {  
    33.     //malloc数组建立在heap堆上,调用完函数还在,返回了那个堆上数组的首地址  
    34.     int* array = (int *)malloc(sizeof(int)*n);  
    35.     int base=100;  
    36.     for(int i=0;i<n;i++)  
    37.     {  
    38.         array[i]=base+i;//赋值  
    39.   
    40.     }  
    41.     return array;  
    42. }  
    43. void showArr(int* arr,int len)  
    44. {  
    45.     for(int i=0;i<len;i++)  
    46.     {  
    47.         printf("%d ",arr[i]);  
    48.     }  
    49.     printf("\n");  
    50. }  
    51. //从函数参数传过来的数组地址  
    52. int getCharsArray(char* output,int len)  
    53. {  
    54.     strncpy(output,"123456789 from china!",len);  
    55.     return 0;  
    56. }  
    57. //动态分配内存  
    58. char* getCharsArrayByPoint(int len)  
    59. {  
    60.     //malloc数组建立在heap堆上,调用完函数还在,返回了那个堆上数组的首地址  
    61.     char* array = (char *)malloc(sizeof(char)*len+1);  
    62.     memset(array,0,sizeof(char)*len+1);  
    63.     strncpy(array,"getCharsArrayByPoint from china!",len);  
    64.     return array;  
    65. }  
    66.   
    67. struct ArrayStruct  
    68. {  
    69.     char buf[1024];  
    70. };//定义结构体时不要忘了分号  
    71.   
    72. //使用结构体作为返回值来传递数组  
    73. struct ArrayStruct byStruct(char *tmp)  
    74. {  
    75.     struct ArrayStruct arr;  
    76.     strcpy(arr.buf,tmp);  
    77.     return arr;  
    78. }  
    79. //关于C语言函数返回数组的问题  
    80. int main(int argc, char *argv[])  
    81. {  
    82.     char* line=test("first test demo\n");  
    83.     printf("%s",line);  
    84.   
    85.     char* line2=test2();  
    86.     printf("%s\n",line2);  
    87.   
    88.     char* line3=test3();  
    89.     printf("%s\n",line3);  
    90.   
    91.     char line4[1024]={0};  
    92.     getCharsArray(line4,sizeof(line4));  
    93.     printf("%s\n",line4);  
    94.   
    95.     char *line5=getCharsArrayByPoint(150);  
    96.     printf("%s\n",line5);  
    97.     free(line5);  
    98.   
    99.     struct ArrayStruct arrStruct;  
    100.     arrStruct=byStruct("byStruct");//用结构体作为返回值传递数组  
    101.     printf("%s\n",arrStruct.buf);  
    102.   
    103.     #define arrLen 10  
    104.     int* arr=getArrays(arrLen);  
    105.     showArr(arr,arrLen);  
    106.     free(arr);//和malloc配对  
    107.     return 0;  
    108. }  

    两点注意:

    1、数组之间的赋值不要直接,即不要直接将数组A赋给数组B,而是要用strcpy(字符型数组)或者memcpy(非字符型数组)。

    2、用结构体定义变量和函数时不要忘了结构体名。

     

    展开全文
  • C语言 函数返回数组和指针区别

    千次阅读 2017-09-14 10:42:32
    那么为啥函数str3()和str4()可以正常返回数组结果,str5()不可以呢,这是因为,他们三个函数中的数组都存放在内存中的栈中,只是因为数组设置的比较 大为1024,当存放的是小数组“Hello!”时候可以返回是因为内存...

    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. 思考

     在理解程序在内存中的存储情况,可以方便理解这个问题。
    展开全文
  • 动态内存分配与动态数组2.1 动态内存分配2.2 动态数组2.3 内存与堆与栈二、自定义函数返回数组1.常见错误2.返回数组的函数三. 总结四. 参考 提示:以下是本篇文章正文内容,下面案例可供参考 一、静态数组和动态...


    提示:以下是本篇文章正文内容,下面案例可供参考

    一、静态数组和动态数组

    1.静态数组的缺点

    1.数组长度必须事先制定,不能为变量,必须为常整数;
    2.传统定义的数组,其内存无法被程序员手动释放。在函数运行期间,系统为其分配的内存一直存在,直到函数运行结束,其内存被系统自动释放;
    3.数组的长度一定固定,将无法改变。数组的长度无法在函数运行的过程扩大或缩小;
    4.传统的定义的数组无法跨函数使用;
    

    2.动态内存分配与动态数组

    2.1 动态内存分配

    我们知道,C语言中构造一个静态整型数组可以表示为 int a[5];,但如果获得动态整型数组直接写成int a[len]是不对的,那么如何构造动态的长度可以选定的数组?就这需要动态内存分配。
    在C 语言中通过库函数malloc分配所需的内存空间,并返回一个指向它的指针。此函数的返回值是一个指针,指向分配空间的第一个字节的地址,所以该函数是一个指针型函数。

    malloc声明: void *malloc(size_t size)

    代码如下(示例1):

    #include <stdlib.h>
    malloc(100)//开辟100字节的动态内存,返回第一个字节的地址
    

    2.2 动态数组

    上面示例中:malloc(100)返回动态内存的100个字节中的第一个字节的地址即返回的指针指向动态内存的第一个字节。我们想要构造一个整型数组,通常整型数组的元素是4个字节即整型数组名指向4个字节而malloc的返回的值指向的是1个字节,显然直接使用malloc函数是无法直接构造一个整形数组,那么如何解决?
    注意到malloc函数的声明指出其返回的指针的基类型是void,即不指向任何类型的数据,只提供一个纯地址。所以我们可以更改基类型,若要构造动态整型数组,则将基类型更改为int,即(int *)malloc(100),此时malloc 函数的返回值指向4个字节(见示例2);若要构造动态浮点型数组,则将基类型更改为float,即(float *)malloc(100),此时malloc 函数的返回值指向8个字节;
    代码如下(示例2):

    #include <stdio.h>
    #include <stdlib.h>
    int main(void)
    {
        int len;
        int * pArr;
        printf("请输入数组的长度:\n");
        scanf("%d",&len);
        pArr = (int *)malloc(sizeof(int) * len);
        free(pArr);//手动释放程序员手动分配的内存
        return 0;
    }
    //此函数实现了动态数组的构造
    //pArr = (int *)malloc(sizeof(int) * len);相当于 int pArr[len];(只是起到等价的作用,这样写C语言中是不支持的)
    

    2.3 内存与堆与栈

    静态内存是栈中分配,动态内存是在堆中分配。

    二、自定义函数返回数组

    1.常见错误

    代码如下(示例3):

    int * Input(void)
    {
        int a[10];
        return a;
    }
    

    该函数为指针型函数。其定义静态数组并返回,由于静态数组(局部变量)在函数运行期间,系统为其分配的内存一直存在,直到函数运行结束,其内存被系统自动释放,所以我们无法接收这个数组.在Xcode中会得到下图的警告,所以我们使用这样的做法接收返回的数组。

    请添加图片描述

    2.返回数组的函数

    动态开辟内存在堆区,堆区不像中静态数组(局部变量)在栈区存储,系统根据它的生命周期自动收回,而是手动开辟,手动释放,这样就可以完全规避问题,具体实例如下:
    代码如下(示例4):

    int * Input(void)
    {
    
        int *a = NULL;
        int *p;
    
        a = (int *)realloc(a,sizeof(int)*10);
    
        for (p=a;p<a+10;p++)
        {
            scanf("%d",p);
        }
        return a;
    }
    

    需要注意的是:记得用完free掉,防止内存泄露!


    三. 总结

    C语言中通过堆区动态开辟内存解决函数的返回数组问题:我们通常用malloc来在堆区动态开辟内存,利用堆区“现用现开辟,用完手动收回”特点,实现灵活管理。

    四. 参考

    1.郝斌C语言教程
    2.谭浩强《C程序设计》
    3.CSDN :C语言自定义函数如何返回数组


    展开全文
  • c语言函数数组返回和指针返回

    千次阅读 2019-04-13 10:09:52
    1先看看第一种,返回数组; #include "stdio.h" char * get_c() { char ch[]="hello"; //这是一个栈空间 char *p; //这也是栈空间 p=ch; printf("%x\n",&ch); printf("%x\n",...

        函数内的数组和指针都是属于函数栈空间。如果把数组或指针返回给外部指针,会发生什么?

    1先看看第一种,返回数组;

    #include "stdio.h"
    
    
    char * get_c()
    {
    	char ch[]="hello";  //这是一个栈空间
    	char *p;			//这也是栈空间
    	p=ch;
    	printf("%x\n",&ch);
    	printf("%x\n",p);
    	printf("%s\n",p);
    	return ch;
    }
    
    int main(int argc, char const *argv[])
    {
    	char *ch;
    
    	ch=get_c();
    
    	printf("%x\n",ch);
    	printf("%s\n",ch);
    	while(1);
    	return 0;
    }

    运行效果:会直接报警告,当然可以无视啦,不过数组的地址居然没有返回出来,地址是0,当然里面也不会有数据啦。

    2看看返回指针的情况:

    #include "stdio.h"
    
    
    char * get_c()
    {
    	char ch[]="hello";  //这是一个栈空间
    	char *p;			//这也是栈空间
    	p=ch;
    	printf("%x\n",&ch);
    	printf("%x\n",p);
    	printf("%s\n",p);
    	return p;
    }
    
    int main(int argc, char const *argv[])
    {
    	char *ch;
    
    	ch=get_c();
    
    	printf("%x\n",ch);
    	printf("%s\n",ch);
    	while(1);
    	return 0;
    }

    运行效果:编译没有错误,地址成功返回了,但是里面的数据居然是乱码,我们可以猜测,由于栈被回收了,这个内存就不属于

    这个数组了,系统或者任务会主动的修改里面的数据,导致就算这个指针指向这个内存,值可能已经不是自己想要的了,也就是

    一个野指针吧。

     

    展开全文
  • C语言函数返回数组

    千次阅读 2018-02-04 21:48:41
    可以的,但大多数方式都是说将数组的首地址作参数输入,或是指针函数返回一个数组的首地址。而这种方式并非真正意义上的“输入”或“输出”。 参数是一个新的量被附了参考量的值,无论函数内部如何改变这个参数,都...
  • C语言函数返回数组的方法

    千次阅读 2020-06-23 15:50:51
    C 语言不允许返回一个完整的数组作为函数的参数。但是,可以通过指定不带索引的数组名来返回一个指向数组的指针。 另外,C 不支持在函数返回局部变量的地址,除非定义局部变量为 static 变量。 示例: u8 *...
  • C语言返回数组长度

    千次阅读 2020-05-11 11:46:40
    C语言返回数组长度 sizeof(type) 用来返回字节长度,可以根据每种类型的不同,设置不同的偏移量,使其返回正确的数组长度。 一般用法:sizeof(array)/sizeof(array[0]) 上述用法就可以返回正确的数组长度,sizeof...
  • 关于C语言函数返回数组的问题

    万次阅读 多人点赞 2016-11-29 23:03:52
    关于C语言函数返回一个数组 c语言中函数不能直接返回一个数组,但是可以用其他方式实现类似功能,不过需要注意: 1、该数组不能是返回函数的局部变量数组,因为局部变量数组在退出函数后会被释放。 可以是全局变量,...
  • C 语言不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。 #include <stdio.h> #include <stdlib.h> #include <time.h> /* 要生成和...
  • c 语言 函数返回数组 介绍 (Introduction) In this tutorial, we are going to understand how we can return an array from a function in C++. 在本教程中,我们将了解如何从C ++中的函数返回数组 。 在C ++函数...
  • 如果您想要从函数返回一个一维数组,您必须声明一个返回指针的函数,如下: int *myFunction(void) { . . } 另外,C 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。 所以我们将数组a定义为...
  • 主要给大家介绍了关于C语言中二维数组作为函数参数来传递的三种方法,文中通过示例代码介绍的非常详细,对大家学习或者使用C语言有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
  • C语言返回数组

    2021-03-18 06:07:30
    首先,看如下的一段C代码,请问这样能正常返回数组吗? #include <stdio.h> int* fun(){int arr[100]; /* 操作 arr[] */ arr[0] = 10; arr[1] = 20; return arr;} int main(){int* ptr = fun...
  • #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 5 double** Link(double a, double b, double c, double d) { double** T = NULL;... // 定义一个二维数组,为.
  • C语言 函数返回一位数组,二维数组

    万次阅读 多人点赞 2019-04-19 18:55:47
    万能的结构体:构造数组的结构体,将函数类型定义为此类型 但是考试的时候应该不太方便写结构体,写不下也会很麻烦,故介绍方法二 方法二: 指针传递: 1、返回一维数组 例子:将数组每一位加一: #include&...
  • C语言-返回数组并输出其值

    千次阅读 2020-04-03 10:10:12
    先看如下程序: #include<stdio.h> #define M 2 #define N 3 int main() ...//函数声明 float score[M][N]={{89,99,80},{100,88,90}}, *aver_stu; int i; //每个学生平均成绩 aver_stu=a...
  • C语言自定义函数如何返回数组

    万次阅读 多人点赞 2017-11-03 21:27:27
    C语言自定义函数如何返回数组  C语言研究中心  CTO 9个月前 (01-28) 4759次浏览 5个评论 最近看到一些同学问题,有提到说:如何在一个函数返回数组呢? 能否直接在自定义 函数中,写成char *类型...
  • C语言允许函数的返回值是一个指针(地址),我们将这样的函数称为指针函数。下面的例子定义了一个函数 strlong(),用来返回两个字符串中较长的一个: #include #include char *strlong(char *str1, char *str2){...
  • C语言函数为什么不能返回数组?在C语言程序开发中,我们不可以编写下面这样的代码:char f(void)[8] { char ret; // ...fill... return ret...
  • 今天在刷题时,碰到这样一个问题,我定义的函数要求返回的是字符串,我在函数中定义了一个字符数组来表示,但是运行时发现函数的返回值为空。 解决方法: 方法1:将字符数组定义为全局变量 方法2:通过malloc申请...
  • C语言第4课——从函数返回数组

    千次阅读 2018-11-24 09:16:29
    如果想要从函数返回一个一维数组,必须声明一个返回指针的函数,如下: int * myFunction() { . . . } 另外,C 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。 数组名是一个指向数组中...
  • 函数通过数组作为参数 如果想通过一个一维数组作为函数的参数,就必须声明函数形式参数,使用以下三种方式与所有三个声明方法之一产生类似的结果,因为每一种方式告诉编译器,一个整数指针将会要被接收。类似的方式...
  • C语言函数如何正确返回数组

    千次阅读 多人点赞 2021-01-28 19:35:47
    实际上我们返回数组的方法是错误的,问题的根源在于:我们在function函数中,定义局部变量a,返回的是a的地址,而a是一个局部变量,当函数调用结束时,局部变量中数据可能已经不复存在了。 方法一:函数外初始化...
  • 因为数组不能被拷贝, 所以函数不能返回数组. 不过, 函数可以返回数组的指针或引用. 声明一个返回数组指针的函数 Type (*function(parameter_list))[dimension] int (*func(int i))[10]; func(int i) 表示调用 func...
  • C从函数返回数组

    万次阅读 多人点赞 2018-11-08 11:05:04
    如果您想要从函数返回一个一维数组,必须声明一个返回指针的函数,如下: int * myFunction() { } 另外,C 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。 现在,让我们来看下面的函数...
  • 该资料引用:参考文献1:C函数返回数组 C 语言不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。 实现源码: #include <stdio.h> #include <...
  • 关注+星标公众号,不错过精彩内容来源|嵌入式时代C语言函数可以返回指针、结构体,为什么不能返回数组?下面一步一步来分析:嵌入式专栏1函数不能返回数组在C语言程序开发中,我们不可以编写下...
  • 首先说下数组与指针的区别 char a[] = “abcdefg”; char *p = “abcdefg” ; 1 a就是数组的首地址 2 数组的内容可以修改,指针的内容不可以修改 在ANSI C中,初始化指针是所创建的字符串时常量,被定义为...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 151,020
精华内容 60,408
关键字:

c语言函数返回数组

c语言 订阅