将堆分配的指针强制转换为指向VLA的指针是否安全?

时间:2014-07-30 12:34:39

标签: c arrays pointers language-lawyer c99

如果我有一个指向代表典型的堆分配空间的指针 行主要二维数组,将此指针强制转换为是否安全 等效的指向VLA的指针,以方便子脚本编写?例如:

//
// Assuming 'm' was allocated and initialized something like:
//
// int *matrix = malloc(sizeof(*matrix) * rows * cols);
//
// for (int r = 0; r < rows; r++) {
//     for (int c = 0; c < cols; c++) {
//         matrix[r * cols + c] = some_value;
//     }
// }
//
// Is it safe for this function to cast 'm' to a pointer to a VLA?
//
void print_matrix(int *m, int rows, int cols) {
    int (*mp)[cols] = (int (*)[cols])m;

    for (int r = 0; r < rows; r++) {
        for (int c = 0; c < cols; c++) {
            printf(" %d", mp[r][c]);
        }
        printf("\n");
    }
}

我已经测试了上面的代码。它似乎有效,对我来说它应该有效,但它是安全的,定义的行为吗?

如果有人想知道,这里的用例是我从a接收数据 文件/套接字/等,表示行主要的2D(或3D)数组,我想使用 VLA避免手动计算元素的索引。

1 个答案:

答案 0 :(得分:4)

如果cols为0或更小,则行为未定义。 C11支持VLA可选(参见例如here,并且您标记了问题C99,它们是必需的),如果它们不受支持,则宏__STDC_NO_VLA__被定义为1(参见C11 6.10.8.3 p1)。

除此之外,你是安全的。

感谢Ouah和Alter Mann!