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

CREE_3 2016-05-19 08:18:17

递归调用时不是应该为局部变量分配新空间吗?为什么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;
}
...全文
222 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-05-20
  • 打赏
  • 举报
回复
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门! 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出
小灸舞 版主 2016-05-20
  • 打赏
  • 举报
回复
参数是一级指针,只能改变指针指向的区域的值(实参和形参都指向同一块内存,但两个指针本身是不同的)
只有传二级指针或者一级指针的引用才能改变指针本身的值(指针的指向)
CREE_3 2016-05-20
  • 打赏
  • 举报
回复
原来如此,谢谢大神!
lm_whales 2016-05-19
  • 打赏
  • 举报
回复
为什么不一样?函数调用的参数传递本质上是值传递 只有引用参数,才是地址传递 每次复制一份node node 的值当然不会变化了

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧