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

标签 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;
}

(这输出 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] 类型

最佳答案

是的,这是合法的,是的,可变修改的类型系统非常有用。您可以使用自然数组语法来访问连续的二维数组,其维度直到运行时才为人所知。

它可以被称为语法糖,因为没有它们就不能用这些类型做任何事情,但它有助于干净的代码(在我看来)。

关于将指向内存缓冲区的指针转换为指向 VLA 的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28524896/

相关文章:

c - 是否有推荐的方法来为 CUnit 测试设置环境变量?

c - 从 C 中的套接字读取时出现内存不足错误?

Javascript:for..in 循环运行次数超过预期

银行家算法中 '->' 的 C 结构无效类型参数

c++ - int* 变量或 int 变量

c - 我的 g_thread_push 不工作

c# - 如何在 C# GUI 中嵌入 C OpenGL 应用程序?

c - 结构体为其成员分配内存

java - 如何让我的数组多次替换某个值?

c - C中动态数组和指针的问题