我的函数的目的是在堆上生成一个整数的二维array.在创建了指向整个数组的指针后,我将指向整个数组的指针返回到一个空*.我觉得有一个更好的返回类型,但我似乎无法理解WRITE语法.

请让我知道,如果我可以做一个更好的返回类型,而不仅仅是一个空*.

void* create_matrix(int x, int y){
    int i, j, count;
    int(*matrix)[x] = calloc(y, sizeof *matrix); // a pointer to a full array of size x.
    //matrix = address of array
    //*matrix = address of first element of array; *(matrix + 1) = address of first element of second array
    //**matrix = element that exists at the first element of array; *(*(matrix + 1) + 1) = second element of second array = matrix[1][1]
    count = 0;
    for(i = 0; i < y; i++){
        for(j = 0; j < x; j++){
            matrix[i][j] = ++count;
        }
    }
    for(i = 0; i < y; i++){
        for(j = 0; j < x; j++){
            printf("%d\n", matrix[i][j]);
        }
    }
    return matrix;
}

推荐答案

您可以返回指向未指定大小的数组的指针:

int (*create_matrix(int x, int y))[]
{
   ...
}

它将与指向VLA的指针兼容:

int (*a)[x]=create_matrix(x,y);

数组类型是兼容的,因为大小在两个位置都不是常量.这在C standard:

要使两个数组类型兼容,两个数组类型都必须兼容 元素类型,如果两个大小说明符都存在,并且 整数常量表达式,则两个大小说明符都应具有 相同的常量值.如果在上下文中使用这两种数组类型 这要求它们是兼容的,如果 两个大小说明符的计算结果不相等

C++相关问答推荐

在C中使用强制转换将uint16_t转换为uint8_t [2]是否有效?

不同到达时间的轮询实现

增加getaddrinfo返回的IP地址数量

正在try 将文件/文件夹名从目录 struct 存储到链接列表

创建一个fork导致fget无限地重新读取文件

这是一个合法的C Strdup函数吗?

当输入负数时,排序算法存在问题

实现简单字典时C语言中的段错误

如何在C语言中正确打印图形

如何用c语言修改shadow文件hash部分(编程)?

ifdef __cplusplus中的整数文字单引号

Boyer Moore算法的简单版本中的未定义行为

使用ld将目标文件链接到C标准库

从BIOS(8086)中读取刻度需要多少?

如何对现有的双向循环链表进行排序?

从Raku nativecall调用时精度不同

UpDown控制与预期相反

clion.我无法理解 Clion 中发生的 scanf 错误

假设函数调用返回的 string(char *) 上有 free() 是否安全?

在k个簇中找到集合划分的最小平方和