в C, я считаю, что следующая программа верна: наведение указателя на выделенный буфер памяти на массив, подобный этому:
#include <stdio.h>
#include <stdlib.h>
#define ARRSIZE 4
int *getPointer(int num){
return malloc(sizeof(int) * num);
}
int main(){
int *pointer = getPointer(ARRSIZE);
int (*arrPointer)[ARRSIZE] = (int(*)[ARRSIZE])pointer;
printf("%d\n", sizeof(*arrPointer) / sizeof((*arrPointer)[0]));
return 0;
}
(выводится 4).
Однако, безопасно ли в C99 делать это с помощью VLA?
int arrSize = 4;
int *pointer = getPointer(arrSize);
int (*arrPointer)[arrSize] = (int(*)[arrSize])pointer;
printf("%d\n", sizeof(*arrPointer) / sizeof((*arrPointer)[0]));
return 0;
(также выводит 4).
Является ли это законным, в соответствии со стандартом C99?
Было бы довольно странно, если бы это было законно, поскольку это означало бы, что VLA эффективно разрешают создание динамического типа, например, типы типа type(*)[variable]
.