繁体   English   中英

为什么将此结构作为函数的参数传递,变化就是值?

[英]Why is this struct passed as argument of a function, change is values?

我有这个结构和这个功能:

typedef struct pares{
int x,y;
} PAR;

arvpre criararvore(
   int i, 
   int j, 
   char matriz[i][j], 
   int x, 
   int y, 
   int *c, 
   PAR vis[], 
   int k
   )

如您所见,我将PAR vis作为结构数组传递。 根据我的经验, vis的值在函数外部声明; 因此应该保持不变,对吗? 例如,如果在调用函数之前全为零,则在函数之后全都应为零。 但是,值在调用函数后会更改。

这是完整的代码:

typedef struct arv *arvpre;

typedef struct arv {
   char valor;
   arvpre N[8];
   int flag;
}Nodo;

typedef struct pares{
   int x,y;
} PAR;

arvpre criararvore(
     int i, 
     int j, 
     char matriz[i][j], 
     int x, 
     int y, 
     int *c, 
     PAR vis[], 
     int k
     )
{
   arvpre a=NULL;
   int z;

   while (*c){
      if (x>=j || x<0 || y<0 ||y>=i || vizitado (vis,k,x,y)) {
            return NULL;
         }
      else {
            a=(arvpre) malloc (sizeof(Nodo));
            a->valor=matriz[y][x];
            vis[k].x=x; 
            vis[k].y=y; 
            k++;
            (*c)--;
            z=*c;
            a->N[0] = criararvore (i,j,matriz,x,y-1,c,vis,k);
            *c=z;
            a->N[1] = criararvore (i,j,matriz,x-1,y-1,c,vis,k);
            *c=z;
            a->N[2] = criararvore (i,j,matriz,x-1,y,c,vis,k);
            *c=z;
            a->N[3] = criararvore (i,j,matriz,x-1,y+1,c,vis,k);
            *c=z;
            a->N[4] = criararvore (i,j,matriz,x,y+1,c,vis,k);
            *c=z;
            a->N[5] = criararvore (i,j,matriz,x+1,y+1,c,vis,k);
            *c=z;
            a->N[6] = criararvore (i,j,matriz,x+1,y,c,vis,k);
            *c=z;
            a->N[7] = criararvore (i,j,matriz,x+1,y-1,c,vis,k);
            *c=z;

            return a;
         }
   }
}

int main(){
   int i,j,c, dimy=3,dimy=4, flag=0;
   PAR vis[23];
   char sopal[3][4]={{'o','r','c','a'},{'r','a','i','o'},{'a','t','n','s'}};
   struct arv teste;
   arvpre a;
   a=&teste;
   for (i=0;i<dimy;i++)
      for (j=0;j<dimx;j++){
         c=23;
         for (b=0;b<23;b++) printf("%d %d ",vis[b].y,vis[b].x);
         printf("\n");
         a=criararvore(dimy,dimx,sopal,i,j,&amp;c,vis,k);
         printf("Sucssess for %c! \n", a->valor);
         for (b=0;b<23;b++) printf("%d %d ",vis[b].y,vis[b].x);
         printf("\n");
      }

   return 0;
}

该程序将出现段故障,但是在此之前将阵列打印几次。 每次调用它都会更改。

为什么是这样?

参数列表中的PAR vis[]PAR* vis完全相同。

通过vis任何分配,例如vis [0].x = 1; 将更改您在调用函数中传递的参数。

PAS是通过指针传递的(数​​组,但是实际上没有区别,因为在这种情况下,它是同一件事),这意味着该函数可以访问完全相同的变量。 通过指针传递意味着仅传递该参数的地址,并且是在单独的函数中更改参数的便捷方法。

如果按值传递它-用C传递数据的另一种方式,则将创建该变量的新本地实例,并且只有在该函数结束之前才具有作用域。 但是,对该参数所做的更改在外部不可见。

还有另一种传递C中不可用的数据的方式-通过引用传递。 通过指针传递参数在某种程度上是“安全”的方式,因为指针可以接收NULL参数,而引用参数则不能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM