2017-10-06 77 views
0

在下面的代码中,我想打印一个3×3矩阵,其中填充了o。但是我没有得到想要的结果。如果使用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

@Sebivor我的问题是完全不同的 – Shubham

+0

似乎你想从'init'函数返回一个局部变量(数组)的地址。你不能那样做。局部变量的范围只在该函数内。阅读“全局变量”和“malloc()”。 – babon

+1

这实际上不是关于范围,而是存储时间。范围是标识符的可见性,并且在此代码中没有与该标识符相关的错误。但是,或者更明确地说,存储期限是指存储期限以外的对象... – Sebivor

回答

2

再问据C11/6.2.4p2

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

在这种情况下,如果你能破译整体,你就会明白什么是错的。你的代码使用了一个指针,当函数返回时它变得不确定,结果你的代码调用了未定义的行为,并且可能会崩溃。

叫它范围,如果必须,但该标准对范围不同的定义,它是在我把我的信任标准。

我最大的担心是你在阅读任何合理的教育资源后如何得到这个问题......这似乎更像是一个猜测,就像你认为你可以通过试验和错误来学习C一样。我想,你可能会很幸运,但是这种可能性很大程度上与你无关。

你应该看书,如果你还没有;它可能会节省你很多漫长的夜晚劳动当你取消注释未使用的变量 ...时消失的回避性错误...

+0

只是有点怀疑:当我在init()中初始化数组时,值被存储在由不同的数组元素指向的特定地址。 tic是本地的,所以在init()执行结束后变得未定义,那没关系。但是这些地址的价值观依然存在吗?我传递了第一个元素的地址。所以,即使tic不存在,我从init返回的地址应该指向所需的值,不会吗? – Shubham

+1

这些地址*的值可能会保留,但您访问它们的唯一方法是通过引用其生命周期之外的对象(根据标准报价,导致未定义的行为)。您的程序*可能还会*泄漏类似于心跳类似漏洞的相关形式的关键数据(这是令人惊讶的相关;这就是您应该具备的重要性)。其他功能*可能会改变你的数据*。我们不能说什么*肯定会发生*,因为行为是未定义的。 – Sebivor

+0

如果我在main()函数中声明数组(tic),然后将数组指针传递给初始化函数,那么它工作正常。但是在这种情况下,当它到达main()之外时,它会超出数组的生命周期。那么,为什么当我将数组指针作为参数传递给main()函数时,它会起作用。为什么数组在一生中保持不变?另外,如果你能提出一个解释这个特定概念的来源,那将是非常好的。非常感谢 – Shubham

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)

1

自动对象(“局部变量”)走出去的范围时,函数返回。这意味着在init()中声明的tic[]不再存在于调用者(main main())中。从技术上讲,这意味着你的程序调用未定义的行为。您需要动态分配malloc()的tic数组。这里有很好的答案#2如何做到这一点,所以不要:-)

相关问题