在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中,使用可变长度数组(VLAs)进行此操作是否安全?
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标准,这合法吗?
如果这是合法的,那将非常奇怪,因为这意味着可变长度数组有效地实现了动态类型创建,例如,类型为type(*)[variable]
的类型。
ARRSIZE
或arrSize
。 - Mike Nakis%zd
。它对应于size_t
的带符号类型。 - Jens Gustedtmalloc(sizeof(int[n][m]))
就可以实现,而且您可以避免不必要的转换。转换是不好的。 - Jens Gustedt