Адрес массива неправильно увеличивается в C

Я пытаюсь сделать рекурсивную функцию для печати содержимого массива. Основное выглядит так:

#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!!?

Это поражает меня, кто-то может помочь с этим? Спасибо за ответ.

3 ответа

Вы допустили логическую ошибку в своем рекурсивном вызове. Посмотрите, что происходит:

Предполагать &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 полностью (это точка рекурсии, чтобы избавиться от глобальных переменных)

Пожалуйста, избавьтесь от глобального значения s_index. Измените вашу подпись 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);
    }
}

Пожалуйста, не делайте действительно странных и непонятных вещей без видимой причины, таких как использование рекурсии, когда простые циклы быстрее, безопаснее и более читабельны. Потому что, когда вы делаете действительно странные вещи нарочно, другие столь же странные вещи имеют тенденцию происходить неожиданно.

#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);
}
Другие вопросы по тегам