В этом примере кода, может ли указатель действительно быть недействительным после цикла while, и следует ли это учитывать при написании кода? Или является стандартом C неправильным толкованием и/или дефектом?Является ли указатель в этом примере кода действительно недействительным?
#include <stdio.h>
int main(int argc, char **argv) {
(void)argc;
(void)argv;
int *pointer;
int object[1];
pointer = object;
printf("pointer -before: %p\n", (void*)pointer);
do {
int other_object[1];
printf("a pointer \"just past\" other_object can look like: %p\n", (void*)(&other_object+1));
printf("address of other_object: %p\n", (void*)&other_object);
} while (0);
puts("the lifetime of other_object has ended");
printf("pointer -after: %p\n", (void*)pointer);
}
Возможный выход (бег на моей машине):
pointer -before: 0x7fff5f744ae4
a pointer "just past" other_object can look like: 0x7fff5f744ae4
address of other_object: 0x7fff5f744ae0
the lifetime of other_object has ended
pointer -after: 0x7fff5f744ae4
Это, кажется, неопределенная указатель в соответствии с принятой SO ответ: Array resizing and realloc function
Этот вопрос также упоминается в следующей статье, с большим количеством примеров кода, создающих неожиданный выход из-за неопределенного поведения:
http://trust-in-soft.com/dangling-pointer-indeterminate/
Оба цитируют это предложение из ISO: «Значение указателя становится неопределенным, когда объект, на который он указывает (или только что прошел), достигает конца своего срока службы».
EDIT: Измененный исходный код немного основанный на комментарии о междунар * против пустоты *
EDIT: Измененный исходный код содержит массивы.
Вы вызывали * неопределенное поведение * для передачи данных, имеющих неправильный тип, на 'printf()', так что это может быть. Поместите свой указатель на 'void *' перед тем, как передать его для печати через '% p'. – MikeCAT
Код, который вы опубликовали, не изменяет (или фактически не использует) переменную 'pointer' в цикле - в отличие от связанной вами статьи. В вашем случае нет причин, по которым 'pointer' станет _indeterminate_. Может быть, вам следует объяснить, почему вы, возможно, начнете с этого. – dxiv
«Почему вы думаете, что это может произойти» Я добавил образец вывода, поэтому его легче увидеть. «Указатель» может легко указывать только мимо other_object, который доходит до конца его жизни. –