在C中返回二维数组

时间:2016-02-04 17:43:43

标签: c types parameter-passing pass-by-reference signature

这很愚蠢,但我无法获得正确的类型签名或其他东西。我想让一个函数返回一个二维数组(在一个维度上固定大小,在另一个维度上变量)但我做错了。最小的例子:

void useit(unsigned long sz) {
    uint32_t arr[sz][8] = makeit(sz);
    // Do something useful with arr here
}

// Stub function for allocating and filling an array
uint32_t (*makeit(ulong sz))[8] {
    uint32_t (*arr)[8] = malloc(8*sz*sizeof(int));
    int i, j;
    for (i = 0; i < sz; i++) {
        for (j = 0; j < 8; j++) {
            arr[i][j] = 10*i+j+11;
        }
    }
    return arr;
}

但我没有签名权,因为gcc抱怨道:

  

错误:分配到类型&#39; uint32_t [8]&#39;时出现不兼容的类型来自类型&#39; uint32_t(*)[8]&#39;

1 个答案:

答案 0 :(得分:3)

你不能使用:

uint32_t arr[sz][8] = makeit(sz);

因为可能没有初始化VLA。

使用:

uint32_t (*arr)[8] = makeit(sz);

http://ideone.com/iuqtlJ处查看它。