Адрес массива неправильно увеличивается в 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);
}