【发布时间】:2015-04-15 23:42:57
【问题描述】:
在 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] 类型的类型。
【问题讨论】:
-
注意:我确认 OP 的代码 compiles on IDEONE 并按照 OP 所说的对不同于 4 的数组大小工作,这意味着它输出您设置的任何
ARRSIZE或arrSize到。跨度> -
根据 C11 草案规范它是合法的。我没有 C99 的副本,所以我无法确认它在上个世纪是合法的。
-
@user3386109:我问的是 C99,因为在 C11 中 VLA 是可选的
-
@MattMcNabb,是的,有
%zd。对应size_t的有符号类型。 -
@Mints97,也考虑完全放弃你的分配功能。它没有做任何简单的
malloc(sizeof(int[n][m]))无法实现的事情,并且您可以避免多余的演员表。演员阵容很糟糕。