我在 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 中的函数。
现在,如果您的数组是 struct
或 union
类型的成员,并且您将该类型的表达式传递给函数,那么您将 在函数中创建整个数组的副本:
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/