关于递归调用局部变量空间分配的问题

C语言 码拜 9年前 (2016-04-21) 1010次浏览
递归调用时不是应该为局部变量分配新空间吗?为什么enumerate函数每次递归,temp传入node->array的地址都一样?
C语言学习中,许多不懂的请高手指点,谢谢!

void enumerate(Node *node,int *data,int x,int y,int row,int column,int MaxDeep,int MinDeep,int MaxWidth,int rest)
{
	int i,j;
	int temp[row][column];
	int rotationData[row][column], udsymData[row][column],rotation90[row][column], rotation180[row][column], rotation270[row][column]; 
	int temp1[row][column],temp2[row][column],temp3[row][column],temp4[row][column],temp5[row][column];
	if((x<0)||(y<0)||(x>=row)||(y>=column))  return;
	for(i=0;i<row;i++)
	{
		for(j=0;j<column;j++)  temp[i][j] = data[i*column + j];
	}
	if(temp[x][y] == 1) return;
	temp[x][y] =1;
	rest = rest-1;
	if((row-x) >= MaxDeep) MaxDeep = row -x;
	if((row-x-1)<=MinDeep) MinDeep = row -x-1;
	if(y <= MaxWidth) MaxWidth = y;
	if(rest<=0)
	{
		if((MinDeep == 0) && (MaxDeep == row) &&(MaxWidth==0))
		{
			if(row != column)
			{ 
			    Rotation180(&temp[0][0],&rotationData[0][0],row,column);
				UDSym(&temp[0][0],&udsymData[0][0],row,column);
				if(InSqureArray(node,&temp[0][0],row,column))	return;
				if(InSqureArray(node,&rotationData[0][0],row,column))  return;
				if(InSqureArray(node,&udsymData[0][0],row,column)) return;
				node->array[node->count] = &temp[0][0];
				printf("node->array[%d] =%p \n",node->count,node->array[node->count]);
				node->count = node->count +1;
				printf("print array\n");
				for(i=0;i<row;i++)
				{
		                for(j=0;j<column;j++) printf("%d",temp[i][j]);
			        printf("\n");
                }
	                printf("\n");
			}
			else if(row == column)
			{ 
			    Rotation90(&temp[0][0],&rotation90[0][0],row,column);
                Rotation180(&temp[0][0],&rotation180[0][0],row,column);
                Rotation90(&rotation180[0][0],&rotation270[0][0],row,column);
                UDSym(&temp[0][0],&udsymData[0][0],row,column);
				if(InSqureArray(node,&temp[0][0],row,column))	return;	 
				if(InSqureArray(node,&rotation90[0][0],row,column))  return;
				if(InSqureArray(node,&rotation180[0][0],row,column))	return;
				if(InSqureArray(node,&rotation270[0][0],row,column))  return;
				if(InSqureArray(node,&udsymData[0][0],row,column)) return;

				node->array[node->count] = &temp[0][0];
				printf("node->array[%d] =%p \n",node->count,node->array[node->count]);
				node->count = node->count +1;
				printf("print array\n");
				for(i=0;i<row;i++)
				{
                                for(j=0;j<column;j++) printf("%d",temp[i][j]);
                                printf("\n");
                }
                printf("\n");
			}
		}
		return;
	}
	for(i=0;i<row;i++)
	{
		for(j=0;j<column;j++)
		{
			temp1[i][j]=temp[i][j];
			temp2[i][j]=temp[i][j];
			temp3[i][j]=temp[i][j];
			temp4[i][j]=temp[i][j];
			temp5[i][j]=temp[i][j];
		}
	}
	enumerate(node,&temp1[0][0],x-1,y-1,row,column,MaxDeep,MinDeep,MaxWidth,rest);
	enumerate(node,&temp2[0][0],x,y-1,row,column,MaxDeep,MinDeep,MaxWidth,rest);
	enumerate(node,&temp3[0][0],x+1,y-1,row,column,MaxDeep,MinDeep,MaxWidth,rest);
	enumerate(node,&temp4[0][0],x-1,y,row,column,MaxDeep,MinDeep,MaxWidth,rest);
	enumerate(node,&temp5[0][0],x+1,y,row,column,MaxDeep,MinDeep,MaxWidth,rest);
  
}
void exec(int row,int column,int n)
{
	int data[row][column];
	int i,j,k;
	Node node;
	Node *p=&node;
	int num;
	for(i=0;i<row;i++)
	{
		for(j=0;j<column;j++)
		{
			data[i][j]=0;
		}
	}
	node.row=row;
	node.coloumn=column;
	node.count=0;
	node.array[MaxNum]= NULL; 
//枚举 
    for(i=0;i<row;i++)
    {
    	enumerate(p,&data[0][0],i,column-1,row,column,0,5,5,n);
     }
     
     printf("node->array[0] =%p \n",node.array[0]);
	sum = sum + node.count;
}
解决方案

15

为什么不一样?函数调用的参数传递本质上是值传递
只有引用参数,才是地址传递
每次复制一份node
node 的值当然不会变化了

30

参数是一级指针,只能改变指针指向的区域的值(实参和形参都指向同一块内存,但两个指针本身是不同的)
只有传二级指针或一级指针的引用才能改变指针本身的值(指针的指向)

10

“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于递归调用局部变量空间分配的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)