代码之家  ›  专栏  ›  技术社区  ›  David Ranieri

指向VLA的指针

  •  3
  • David Ranieri  · 技术社区  · 7 年前

    你可能知道, VLA's haves pros and cons

    我想让VLA可选的主要原因是:“堆栈可能会爆炸”:

    int arr[n]; /* where n = 1024 * 1024 * 1024 */
    

    但是指向弗拉的指针呢?

    int m, n;
    
    scanf("%d %d", &m, &n);
    
    int (*ptr)[n] = malloc(sizeof(int [m][n]));
    

    在这种情况下,不存在炸毁堆栈的风险,在我看来,它们非常有用。

    委员会是否可以保留指向VLA的指针,使VLA指向非指针类型成为可选的?

    还是一件事意味着另一件事?

    1 回复  |  直到 7 年前
        1
  •  2
  •   StoryTeller - Unslander Monica    7 年前

    保留指向可变可修改类型的指针需要实现支持大约90%的VLA规范。原因是有效类型规则:

    6.5表达

    6访问其存储值的对象的有效类型 通过具有以下类型的左值而没有声明类型的对象 如果不是字符类型,则左值的类型将成为 该访问和后续访问的有效对象类型 使用memcpy或memmove插入到没有声明类型的对象中,或者 复制为字符类型的数组,然后复制 为该访问和后续访问修改了对象 “不修改”值是从中删除的对象的有效类型 将复制该值(如果有)。对于对 对象没有声明的类型,则该对象的有效类型为 只是用于访问的左值的类型。

    在通过 ptr malloc

    int boo[n];
    

    ... 这有点傻。如果实现支持 对于动态分配对象的VLA语义,它还可以允许将它们声明为具有自动存储持续时间的对象。委员会希望它是真正可选的,因此这意味着指向VLA类型的指针也必须被删除。