Единственный случай, который может вызвать проблемы, - это если *ptr
имеет тип массива переменной длины, потому что это единственный случай, когда sizeof
вычисляет свой операнд.
То есть:
int n = ...;
T (*ptr)[n] = malloc(sizeof *ptr);
имеет неопределенное поведение, потому что тип *ptr
равен T [n]
, который является типом массива переменной длины, что означает, что sizeof
оценивает его операнд, который разыменовывает неинициализированный указатель (*ptr
).
Однако случайно столкнуться с этой проблемой сложно.Обычно вы просто делаете
T *ptr = malloc(n * sizeof *ptr);
, что хорошо 1 .
1 Что ж, умножение может быть переполнено.Чтобы защититься от этого, вам нужно что-то вроде T *ptr = calloc(n, sizeof *ptr);
.