数组地址在C中没有正确递增

时间:2014-11-10 09:20:36

标签: c arrays pointers

我正在尝试创建一个递归函数来打印数组的内容。 主要看起来像这样:

#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);
}

我注意到的是:

如果&even0x7fffffffdbf0,则(array + s_index)会增加s_index,如下所示:

s_index = 0 : 0x7fffffffdbf0;
s_index = 1 : 0x7fffffffdbf4;
s_index = 2 : 0x7fffffffdbfc;

它应该是0x7fffffffdbf8 !!?

这让我大吃一惊,有人可以帮忙吗? 谢谢你的回答。

3 个答案:

答案 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);
}