(*((tfa*) NULL)).info[sz]
не является типом массива переменной длины, потому что (*((tfa*) NULL)).info
не является типом.
Так что это рассматривается как обычное выражение, ссылающееся на элемент sz
массива (*((tfa*) NULL)).info
. Согласно приведенной спецификации, это не оценивается, поэтому тот факт, что он разыменовывает NULL
, не вызывает неопределенного поведения. Он просто возвращает размер элемента массива, который не зависит от расположения массива или индекса. Вот почему он компилируется без предупреждения и не падает.
Но это не дает желаемого результата. Вы получаете только размер одного элемента массива, а не sz
элементов, для которых вам действительно нужно выделить место. Вам нужно умножить размер элемента на количество элементов. Так что используйте
tfa *ptr = malloc(sizeof *ptr + sz * sizeof ptr->info[0]);