在下面的代码中,我想打印一个填充了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;
}
答案 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上有很好的答案如何做到这一点,所以不要再问: - )