Причина этого, как представляется, работа заключается в том, что вы увеличиваете свой указатель, указывая на новые пятна в памяти (которые ваша программа может или не может быть выделена для использования). Я предполагаю, что вы объявляете это в стеке, и поэтому ваше неопределенное поведение выглядит «нормально».
Я не думаю, что вы понимаете силу указателя и синтаксиса, который вы использовали.Замечание о том, что следующее эквивалентно:
int arr[ 2 ] = { 1, 2 };
int *pi = &arr;
// The following output is equivalent to...
for (int i = 0; i < 2; i++) {
printf("arr[i] = %d.\n", arr[ i ]);
}
// this.
for (int i = 0; i < 2; i++) {
printf("*(p + i) = %d.\n", *(p + i));
}
Рассмотрим это, альтернативную реализацию кода, чтобы подчеркнуть, как вы направляете на новые адреса памяти с помощью индексации элементов за пределами вашего массива.
int *d = (int *)malloc(2 * sizeof(int));
*(d + 0) = 4; // Observe you are accessing the memory location d points to.
*(d + 1) = 5; // Observe you are accessing the memory location d + 4 bytes (or 8 if 64-bit) points to...
*(d + 2) = 8; // ...
*(d + 3) = 9; // ...
*(d + 4) = 7; // Observe you are assigning a value to the memory location of d + 24 bytes (or 48 bytes if 64-bit).
for (int i = 0; i < 5; i++) {
printf("%d \n", *(d + i));
}
Просто краткое примечание к вашему коду. Обычно malloc следует за бесплатным - поэтому используйте его соответствующим образом, чтобы не было утечек памяти.
Я надеюсь, что это помогло! Не стесняйтесь исправить меня, если я совершу ошибку.
Поведение вашего кода Неопределенное означает, что при разном выполнении вы можете заметить различное поведение, вы не можете заранее предсказать, что ваша программа может однажды произойти сбой. Этот код неправильный! ненадежный, к сожалению, компилятор C не сообщает об этом. –