我的项目中有一个文件,其中有一个定义为MyStruct_t myStruct[SIZE]
的本地结构数组,我可以在该模块中使用。现在我想让它可以访问不同的代码模块,所以我想出了一个函数:
MyStruct_t *GetStruct(void) {
return myStruct;
}
但是当我从不同的模块中调用它时,我收到错误expression must be a modifiable lvalue
。我的来电者看起来像:
void myFunc(void) {
MyStruct_t locStruct;
locStruct = GetStruct();
}
我怎样才能做到最好?
答案 0 :(得分:2)
GetStruct
返回指向myStruct[SIZE]
元素的指针,而不是MyStruct_t
。除非你真的需要副本,否则请locStruct
指针,如下所示:
MyStruct_t *locStruct = GetStruct();
请注意,locStruct
是MyStruct_t
的数组,大小为SIZE
。
如果您确实要制作副本,请取消引用GetStruct()
的结果:
MyStruct_t locStruct = *GetStruct();
这将产生myStruct
数组的初始元素的副本。
由于GetStruct
除了访问myStruct
之外不提供其他服务,您也可以将myStruct
设为全局(extern
)而不是static
。
最后,您可以更改GetStruct
以访问特定元素。这也会检测到超出 - 即尝试使元素超过SIZE
或负指数:
bool GetStruct(int index, MyStruct_t *ptr) {
if (index < 0 || index >= SIZE) {
return false;
}
*ptr = myStruct[index];
return true;
}
现在GetStruct()
的调用看起来像这样:
MyStruct_t locStruct;
if (GetStruct(5, &locStruct)) {
// All good
} else {
// Error
}
答案 1 :(得分:1)
GetStruct
返回一个指针,因此你的locStruct
变量也应该是一个指针。
void myFunc(void) {
MyStruct_t *locStruct;
locStruct = GetStruct();
}
答案 2 :(得分:1)
例如,您可以采取以下方式
void myFunc( void )
{
MyStruct_t locStruct[SIZE];
MyStruct_t *p = GetStruct();
memcpy( locStruct, p, SIZE * sizeof( MyStruct_t ) );
}
或者可能有一个指向数组第一个元素的指针
void myFunc( void )
{
MyStruct_t *locStruct = GetStruct();
}
在这种情况下,访问数组元素的语法与例如locStruct[i]
答案 3 :(得分:1)
如果myStruct
在其他模块中是全局的,那么您可能正在寻找extern
关键字。把它放在另一个模块中:
extern MyStruct_t myStruct[];
(我假设MyStruct_t是一个typedef
ed名称。否则你需要在它之前放置关键字struct
。)
这也需要访问MyStruct
的声明。将它放在头文件中并将其包含在两个模块中。
这是一个简单的例子:
// main.h ------------------------------------------------
typedef struct {
int a, b, c;
} AStruct;
// func.h ------------------------------------------------
void func(void);
// main.c ------------------------------------------------
#include <stdio.h>
#include "main.h"
#include "func.h"
AStruct as[100];
int main(void) {
func();
printf("%d,%d,%d\n", as[0].a, as[0].b, as[0].c);
return 0;
}
// func.c ------------------------------------------------
#include "main.h"
#include "func.h"
extern AStruct as[];
void func(void) {
as[0].a = 1;
as[0].b = 2;
as[0].c = 3;
}