常德砍王
2019-08-07 14:23
采纳率: 100%
浏览 1.5k

返回值是数组,主函数应该如何调用

我想输出子函数里面的a数组,这段代码为什么不行呢?

#include<stdio.h>
#include<string.h>

char *fun()
{
    char a[] = {'1','2'};
    return a;
}

int main()
{
    char *b;
    b = fun();
    printf("%s", b );
}

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • 舞星散落 2019-08-07 15:52
    已采纳
    char *fun()
    {
        static char a[] = {'1','2'};
        return a;
    }
    

    函数部分改成这样就可以了

    你错误的原因是:
    你让函数返回了一个指针让b指向它是不假,

    但是 这个函数中返回的指针a是一个局部变量, 返回之后, 指针a就会被释放掉, a数组的内容也不存在了

    那么此时 b指向了哪里呢 指向的目标a数组已经消失了
    指向了被撤销的内存地址 而这个地址上的内容已经没了

    此时你再打印b的内容当然打不出来

    2 打赏 评论
  • qtchen_1988 2019-08-07 15:02

    你这个问题应该是栈内存跟堆内存的区别,如果指针指向函数的局部变量(存储在栈内)返回值时,当函数执行完了就会释放掉栈内存数据,最后你的指针指向了被释放的内存块,里面的数据是垃圾数据。

    #include <stdio.h>
    #include<string.h>
    #include <stdlib.h>
    
    
    char *fun()
    {
    //    char a[] = {'1','2'};
        char *a = (char *)malloc(3*sizeof(char));
        memset(a,0x0,3);
        a[0] = '1';
        a[1] = '2';
        return a;
    }
    
    int main()
    {
        char *b;
        b = fun();
        printf("%s", b );
    }
    
    

    如果不对,欢迎指正

    2 打赏 评论
  • Rotch 2019-08-07 14:30
    #include<stdio.h>
    #include<string.h>
    
    char fun(char* b)
    {
        char a[] = {'1','2'};
        strcpy(b, a);
    }
    
    int main()
    {
        char b;
        fun(&b);
        printf("%s", &b );
    }
    

    望采纳,谢谢

    1 打赏 评论

相关推荐 更多相似问题