2014-07-11 296 views
0

快速提问如何为变量赋值数组元素的值。试图确保我的代码使用最小的内存。C变量赋值给数组元素

如果我有一个预定义的结构体数组,并且想要创建对数组中一个元素的引用,那么如何创建该变量以便通过引用传递而不是值?我搜索了这个,但也许我的搜索字符串不是它需要的。

例如

#myfile.h 
typedef struct { 
    uint8_t abba; 
    uint8_t zabba; 
} mystruct; 

extern mystruct mystructs[2]; 

#myfile.c 
mystruct mystructs[2] = { 
    {.abba=0,.zabba=1}, 
    {.abba=2,.zabba=3} 
}; 

void myfunc1() { 
    mystruct ms1 = mystructs[1]; 
    printf("%d", ms1.abba); 
    ms1.zabba = 5; 
} 

void myfunc2() { 
    printf("%d", mystructs[1].abba); 
    mystructs[1].zabba = 5; 
} 

所以我的问题如下: 当我创建myfunc1 MS1,它只是给mystructs一个参考文献[1]?或者它将元素复制到ms1中?

myfunc1和myfunc2会在内存使用情况下产生相同的结果吗?

将ms1.zabba = 5实际更新mystructs [1] .zabba?

+0

如果我能接受Peter Schneider和Quentin的答案。 Peter详细介绍了它的工作原理,Quentin给出了创建ms1作为指针的例子。 – user3817250

回答

2

当我创建myfunc1 MS1,它只是给mystructs一个参考文献[1]?

不,这是一个副本。

还是把它复制到ms1中?

是。

myfunc1和myfunc2会在内存使用情况下产生相同的结果吗? (更详细地说:myfunc1创建一个mystruct类型的本地对象(“在堆栈上”);在离开函数之后,所有东西都恢复到原来的样子,所以没有造成任何危害。结构并不大,所以没问题,在个人电脑上你可能会遇到大的问题(MBs)或昂贵的问题(例如套接字连接))。

不,因为ms1是副本。

您可能想使用指针或引用。

2

这是一个副本。你需要使用一个指针来实际修改远程结构:

void myfunc1() { 
    mystruct *ms1 = &mystructs[1]; 
    printf("%d", ms1->abba); 
    ms1->zabba = 5; 
} 
+0

我最初在我的代码中试过这个,但我得到了警告。 “#145-D”const mystruct *“类型的值不能用于初始化一个”mystruct *“类型的实体,所以我假定我做了错误的事情。代码编译并且似乎按照预期的那样运行。 – user3817250

+0

警告不要掉以轻心,但在你的问题中没有提到'mystructs'是'const' ... – Quentin

+0

Quentin说的是真实的;不应该发生警告如果你尝试组装一个小的工作示例需要编译器消息的main()!)我们可以看到它来自哪里,可能会很明显 –