首页 > 解决方案 > 以这种奇怪的方式创建二维数组的函数的返回类型

问题描述

这个问题的来源参考:Freaky way of allocating 2D array

我使用了对引用帖子的答案中显示的代码的改编来创建字符串数组:

char (*string)[rows] = malloc(sizeof(char [rows][cols]));
memset(string, 0, sizeof(char [rows][cols]));

我意识到对于非常大的数组,这种方法不是最佳的,因为在尝试分配时,单个大块的连续内存变得非常昂贵。但是在创建中小型阵列时,这些优势可能很有吸引力。例如。此方法仅使用一次调用malloc(), 来分配一个连续的块内存,因此free()在使用它时只需要一次调用,使其成为我见过的更多惯用方法的理想替代方案。(那些使用多次调用malloc()free(),)

所以,我想把它封装成一个函数,但到目前为止我还没有发现什么返回类型是兼容的:

T  CreateStringArray(int rows, int cols)
{
    char (*string)[rows] = malloc(sizeof(char [rows][cols]));
    memset(string, 0, sizeof(char [rows][cols]));

    return T;
}

什么形式T可以与此功能一起使用?

标签: cdynamic-arrays

解决方案


你可以尝试这样的事情:

void * CreateStringArray(int rows, int cols)
{
    char (*string)[cols] = malloc(sizeof(char [rows][cols]));
    memset((void*)string, 0, sizeof(char [rows][cols]));

    return string;
}

int main()
{
    char (*p)[4] = (char (*)[4])CreateStringArray(3, 4);
}

请注意,char (*string)[cols]应使用colsnot定义rows。因为string是指向一维cols元素数组的指针。

延期:

关于为什么使用cols而不是的详细信息rows

使用时,数组名称是指向其第一个元素的指针。例如int arr[5],这里arr是一个指向a[0].

虽然int a[rows][cols],这里a不是a[0][0]指向它的指针,而是指向其a[0]类型的指针int (*)[cols]

要理解这一点,您必须考虑 C 是如何在内存中存储多维数组的?它实际上是逐行存储为一维数组。

egint a[2][3] = {{1, 2, 3}, {4, 5, 6}};存储为1 2 3 4 5 6,这里a[0]{1, 2, 3}一个指向的指针,指向的指针a[0]{1, 2, 3}指向 3 个整数的数组的指针,可以写成int (*)[3]=> 通常它是 `int (*) [cols]'


推荐阅读