我无法从函数中传递返回的字符数组,作为另一个函数中的参数

时间:2017-10-06 17:45:15

标签: c

在下面的代码中,我想打印一个填充了o的3 * 3矩阵。但我没有得到所需的输出。如果你使用C99编译器运行程序,第一个矩阵输出是我所期望的,第二个输出是我得到的。 如果我在init()进行初始化,而不是初始化函数main(),它可以正常工作。但我不知道为什么阵列没有从init()正确返回,因此我可以将它用作display()函数中的参数。请帮忙

 #include<stdio.h>
    char * init(int a)
    {
        char tic[a][a];
        for(int i=0;i<=(a-1);i++)
        {
            for(int j=0;j<=(a-1);j++)
            {
                tic[i][j]='o';
            }
        }
        display(a,tic);//This is extra code just to show what I desire to print through this program
        return (char * )tic;
    }


    int display(int a,char tic[a][a])
    {                                                                        
        for(int i=0;i<=(a-1);i++)   
        {
            for(int j=0;j<=(a-1);j++)                   
            {
                if(j==0)
                {
                    printf("\n-------------\n|");
                }
            printf(" %c |",tic[i][j]);
            }
        }
            printf("\n-------------");

            return 0;
    }


    int main()
    {
        int a=3;
        display(a,init(a));

        return 0;
    }

3 个答案:

答案 0 :(得分:2)

根据C11/6.2.4p2

  

对象的生命周期是程序执行的一部分,在此期间保证为其保留存储。存在一个对象,具有一个常量地址,并在其整个生命周期内保留其最后存储的值。如果在其生命周期之外引用对象,则行为未定义。当指针指向(或刚刚过去)的对象到达其生命周期的末尾时,指针的值变得不确定。

在这种情况下,如果你可以解读全部内容,你就会理解错误。您的代码使用的指针在函数返回时变得不确定,因此您的代码调用了未定义的行为,并且可能已崩溃。

如果必须,将其称为范围,但标准对范围有不同的定义,并且它符合标准我信任。

我更关心的是你在阅读任何合理的教育资源之后如何来到这里...这似乎更像是一种猜测,就像你认为你可以通过试错来学习C 。我想你可能会很幸运,但是你的赔率很高。

如果你还没有,你应该读一本书;它可能会为你节省很多漫长的夜晚,因为当你取消注释未使用的变量时,消失的恶意消失...

答案 1 :(得分:1)

在我看来,你试图将返回(一个字符指针)传递给一个询问不同参数的函数(理想情况下矩阵将是字符指针的指针)。因此,我建议您将char * init(int a){更改为char ** init(int a),并将其更改为return (char ** )tic;

此外,您应该将功能显示中的参数int display(int a,char tic[a][a])更改为int display(int a,char **tic)

答案 2 :(得分:1)

当函数返回时,自动对象(“局部变量”)超出范围。这意味着调用者(此处为main())不再存在init()中声明的<p>TESTING</p>。从技术上讲,这意味着您的程序会调用未定义的行为

您需要使用tic[]动态分配tic数组。 Stackoverflow上有很好的答案如何做到这一点,所以不要再问: - )