用get()返回静态结构数组指针

时间:2014-07-04 16:38:35

标签: c pointers struct return-value

我的项目中有一个文件,其中有一个定义为MyStruct_t myStruct[SIZE]的本地结构数组,我可以在该模块中使用。现在我想让它可以访问不同的代码模块,所以我想出了一个函数:

MyStruct_t *GetStruct(void) {
  return myStruct;
}

但是当我从不同的模块中调用它时,我收到错误expression must be a modifiable lvalue。我的来电者看起来像:

void myFunc(void) {
    MyStruct_t locStruct;
    locStruct = GetStruct();
}

我怎样才能做到最好?

4 个答案:

答案 0 :(得分:2)

GetStruct返回指向myStruct[SIZE]元素的指针,而不是MyStruct_t。除非你真的需要副本,否则请locStruct指针,如下所示:

MyStruct_t *locStruct = GetStruct();

请注意,locStructMyStruct_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;
}