Does the above code invoke Undefined Behavior?
Это зависит.
От C11 проекта 6.3.2.3/7:
A pointer to an object type may be converted to a pointer to a different object type. If the resulting pointer is not correctly aligned) for the referenced type, the behavior is undefined.
В качестве выравнивания для char
может отличаться от int
, что, вероятно, менее ограничительный, назначая char * pc
к int * pi
может привести к pi
существам перекос.
Однако для конкретных примера, приведенного ОР:
char * pc = malloc(64);
int * pi = pc;
поведение будет определяться как (см Alter Mann «ы comment) malloc()
гарантированно возвращает блок памяти правильно выровнена ,
От C11 проекта 7.22.3:
The pointer returned [by aligned_alloc, calloc, malloc, and realloc] if the allocation succeeds is suitably aligned so that it may be assigned to a pointer to any type of object with a fundamental alignment requirement ...
В качестве примера, который бы привести к непредсказуемому поведению, из-за перекоса, является:
char * pc = malloc(64);
int * pi = pc + 1;
Does the above code snippet free the memory allocated by malloc for str?
В случае прежнее задание ввело бы неопределенное поведение, этот вопрос не имеет значения vant, поскольку что-то может случиться с UB, который уже был вызван.
Если еще предварительное назначение не сослались UB, вызов free()
бы совершенно де-выделить блок памяти, на который ссылается, как преобразование обратно значение указателя из int *
в void *
, как первоначально предусмотрено malloc()
, хорошо определены.
С C11 проекта 6.3.2.3/7 (продолжение /):
Otherwise, when converted back again, the result shall compare equal to the original pointer
и
Из C11 проекта 6.3.2.3/1:
A pointer to void may be converted to or from a pointer to any object type. A pointer to any object type may be converted to a pointer to void and back again; the result shall compare equal to the original pointer
Какой у вас компилятор? Приведенный выше код дает ошибку: не может преобразовать 'char *' в 'int *' при инициализации' с gcc 4.9.2. – farukdgn
Я тоже думал о том, чтобы задать этот вопрос, после вчерашнего вопроса. Спасибо за продолжение этого ... :-) – alk
@farukdgn, Получил эту ошибку при компиляции с использованием g ++ в C++. GCC, похоже, скомпилирует его. Я использую GCC 4.8.1. –