相关疑难解决方法(0)

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

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

c arrays pointers c99

12
推荐指数
1
解决办法
681
查看次数

标签 统计

arrays ×1

c ×1

c99 ×1

pointers ×1