C语言函数返回数组

能够直接在自定义函数中,写成指针类型返回值,直接返回呢?

#include 
int* func()
{
    int str[5]={1,2,3,4,5};
    return str;
}

int main()
{
    int *b;
    b = func();
    for(int i=0; i<5; i++)
        printf("%d", b[i]);
    return 0;
}

直接返回str数组名(注意不需要加&)。但事实上,运行结果并不正确,因为str本身是一个自定义函数中的局部变量,是一个数组有5个字节,它的生命周期当然也随着它所在的函数在一起,随着fun函数调用的结束,其中的各种局部变量也将被系统收回,所以str数组这5个字节也将被回收,自然在main函数里再输出肯定已经不是原来的内容了。

方法一:

#include 
int* func()
{
    //char *str = "hello world!";
    int *str ;
    str  = (int *)malloc(5*sizeof(int));
    for(int i=0; i<5; i++){
        *(str+i) = i;
    }
    return a;
}

int main()
{
    int *b;
    //char *b;
    b = func();
    for(int i=0; i<5; i++)
        printf("%d\n", b[i]);
    free(b);
    //printf("%s\n", b);
    return 0;
}

采用指针传递的方式。str虽然也是一个局部变量,但它是一个指针,只有四个字节,当它指向字符串时,字符串存在常量区,  而不属于fun函数里的部分,全程序可读,所以return后依旧存在;当指向非字符串时,采用malloc为str指向的空间分配内存,数据保存在堆区,注意在程序结束是要释放(free)掉内存。跟据自己需要在函数中加入形参。

方法二:

#include 
int* func()
{
    static int str[5] = {1,2,3,4,5} ;
    return str;
}

int main()
{
    int *b;
    b = func();
    for(int i=0; i<5; i++)
        printf("%d\n", b[i]);
    return 0;
}

采用static关键字。

方法三:

#include 
%%%求100以内的素数%%%
int func(int n, int a[])
{
    int flag;
    int num=0;
    for(int i=2;i<=n;i++){
        flag = 1;
        for(int j=2; j<(int)i/2; j++){
            if(i%j==0){
                flag = 0;
                break;
            }
        }
        if(flag){
            a[num] = i;
            ++num;
        }
    }
    return num;
}

int main()
{
    int b[100];
    int n;
    n = func(100,b);
    for(int i=0; i

使用参数,将结果直接保存在传入参数中。

返回二位数组时的方法也是一样。

采用static的方式:

#include 
int **func()
{
    static int str[3][3] = {{1,2,3},{4,5,6},{7,8,9}} ;
    return str;
}

int main()
{
    int **b;
    b = func();
    for(int i=0; i<3; i++){
        for(int j=0; j<3; j++){
            printf("%d\n", *((int *)b+3*i+j));
        }
    }
    return 0;
}

采用malloc的方式: 

#include
#define M 3
#define N 2
int main(){
    int **addOne(int a[M][N]);
    int a[M][N]={{1,1},{2,2},{3,3}};
    int i,j;
    printf("\n调用函数之后:\n");
    int **b = addOne((int **)a);
    for(i=0;i

你可能感兴趣的:(c语言)