c - 在多个 C 模块之间传递大数组

标签 c arrays

我在 table.c 中定义了几个相当大的数组(每个数组大约有 1500 个成员)。我需要将它们传递给不同的模块和/或提供一种如何更新它们的方法。

我的问题是如何使其最高效而不浪费内存。我的想法是采用标准的 getters/setters。因此,如果对于 get 我将有一个公共(public)函数:

void getTable(tableID, *table)

tableID 将是定义我想要的巫师表的枚举,而 *table 将是指向表的指针。我猜想只是传递了一个引用,因此该表在内存中不会“重复”。

然后在 otherModule.c 中我将调用

table *myPointer;
getTable(TableA, myPointerTable).

正确吗?

最佳答案

在大多数情况下,数组表达式“衰减”为指针,因此如果您定义类似的内容

T humongous[50000]; // for some arbitrary type T

并将其传递给类似的函数

foo( humongous );

foo 接收到的只是指向第一个元素的指针,而不是整个数组:

void foo( T *arr ) { ... }

请注意,在函数参数声明的上下文中,T a[N]T a[] 的处理方式与 T *a 相同 - 它们都将 a 声明为指向 T指针。基本上,您不能将数组“按值”传递给 C 中的函数。

现在,如果您的数组是 structunion 类型的成员,并且您将该类型的表达式传递给函数,那么您 在函数中创建整个数组的副本:

struct blah {
  ...
  T humongous[50000];
  ...
} bletch;

foo( bletch );

void foo( struct blah b ) { ... } // b is a full copy of bletch

因此,在这种情况下,您可能需要将指针传递给bletch:

foo( &bletch );

void foo( struct blah *b ) { ... }

关于c - 在多个 C 模块之间传递大数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46218791/

相关文章:

c - 节点的全局变量

android - 免费的条形码图像解码库

node.js - 不能将扩展运算符与三元运算符一起使用

C++将二维数组对象插入另一个对象

比较两个分数(< 和 friend )

c++ - GCC Windows __asm RDTSC 破坏者

javascript - 如何使用函数(for-loop)从按钮获取用户输入以显示在文本框中?

javascript - 重复数组 x 次,然后再次重复删除第一项,直到数组消失

java字节数组转换为字符串,但在不同的操作系统中结果不同

c - C 结构上的意外内存转储