我正在尝试创建一个递归函数来打印数组的内容。 主要看起来像这样:
#include <stdio.h>
static int s_index;
int main(void) { int even[] = {2, 4, 6, 8}; s_index = 0; print(even);}
打印功能如下所示:
void print(int * array) {
if(s_index > 3) {
printf("\n"); return;
}
printf(" %d ", *array); ++s_index; print(array + s_index);
}
我注意到的是:
如果&even
为0x7fffffffdbf0
,则(array + s_index)
会增加s_index
,如下所示:
s_index = 0 : 0x7fffffffdbf0;
s_index = 1 : 0x7fffffffdbf4;
s_index = 2 : 0x7fffffffdbfc;
它应该是0x7fffffffdbf8
!!?
这让我大吃一惊,有人可以帮忙吗? 谢谢你的回答。
答案 0 :(得分:2)
你在递归电话中犯了一个逻辑错误。看看会发生什么:
假设&even = 0x7fffffffdbf0
第一个电话:
array = 0x7fffffffdbf0 ; s_index = 0
。
您增加s_index
并转入第二个调用array + s_index
,其产生:
第二个电话:
array = 0x7fffffffdbf4 ; s_index = 1
。
再次,您增加s_index
并转入第三个调用array + s_index
,这会产生:
array = (0x7fffffffdbf4) + 2 => 0x7fffffffdbfc
每次递归调用只应该将数组增加1,并完全删除s_index
(这是递归的点,去除全局变量)
答案 1 :(得分:1)
请删除全局值s_index.Change您的func签名,如下所示
int main(void)
{
int even[] = {2, 4, 6, 8,10,12};
print(even,(sizeof(even)/sizeof(int)));
}
void print(int * array,int len) {
if( len == 0)
{
printf("\n"); return;
}
else
{
printf(" %d ", *(array));
print(array+1,len-1);
}
}
答案 2 :(得分:0)
请不要因为没有明显的原因而做一些非常奇怪和模糊的事情,例如使用递归,其中简单的循环更快,更安全,更易读。因为当你故意做一些奇怪的事情时,其他同样奇怪的事情往往会意外发生。
#include <stdio.h>
void print(int* array, size_t size)
{
for(size_t i=0; i<size; i++)
{
printf("value:%d address:%p\n", array[i], (void*)&array[i]);
}
}
int main(void)
{
int even[] = {2, 4, 6, 8};
print(even, 4);
}