将指向内存缓冲区的指针转换为指向VLA的指针

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].

M.M*_*M.M 7

是的,这是合法的,是的,可变修改型系统非常有用.您可以使用自然数组语法来访问连续的二维数组,这两个数组的维度在运行时都是未知的.

它可以被称为语法糖,因为没有它们可以用这些类型做你没有它们就做不到的事情,但是它会产生干净的代码(在我看来).

  • @Mints97,如果你还没有想到,你可以使用SO批准的[malloc惯用法](http://stackoverflow.com/a/605858/1505939) `ptr = malloc(N * sizeof *ptr) ;` 也在这里,例如 `int (*ptr)[cols] = malloc(rows * sizeof *ptr);` (2认同)