c - 以这种奇怪的方式创建二维数组的函数的返回类型
问题描述
这个问题的来源参考: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
可以与此功能一起使用?
解决方案
你可以尝试这样的事情:
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]
应使用cols
not定义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]'
推荐阅读
- python-3.x - 当我尝试使用 Flask rest API 上传文件时,我得到:上游过早关闭连接,同时从上游读取响应标头,客户端
- python - 如何制作动态静态属性?
- node.js - 它发送了 4 倍的会员数量
- swift - 快速蒸汽叶环
- docker - 将 DDEV 数据库挂载到主机文件系统,而不是在 docker 卷内
- python - 如何在固定接近度内获取单词周围的所有单词
- python - https 连接超时导致的 AWS Lambda 函数持续时间峰值
- c++ - 构造函数不初始化类元素
- javascript - 如何为玩家分配 2 位数的唯一 ID
- c# - 当敌人看到玩家时让他攻击