Min*_*s97 12 c arrays pointers c99
在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;
}
Run Code Online (Sandbox Code Playgroud)
(这输出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;
Run Code Online (Sandbox Code Playgroud)
(也是输出4).
根据C99标准,这是否合法?
如果它是合法的,那将是很奇怪的,因为这意味着VLA有效地启用动态类型创建,例如,类型的类型type(*)[variable]
.
是的,这是合法的,是的,可变修改型系统非常有用.您可以使用自然数组语法来访问连续的二维数组,这两个数组的维度在运行时都是未知的.
它可以被称为语法糖,因为没有它们可以用这些类型做你没有它们就做不到的事情,但是它会产生干净的代码(在我看来).