假设存在一个返回消息的函数 说出以下格式:
struct message
{
void* data;
}msgG;
这是提取数据的最佳方式(即获取代码中fun1可访问的消息): 1-使用全局变量 2-使用双指针(指向指针的指针)
//Note: msgG is the global variable
void fun2(struct message **ptr)
{
**ptr = msgCreate(); // msgCreate returns a type struct message;
msgG = msgCreate();
}
void fun1()
{
....
.....
struct message *ptr;
ptr = malloc(sizeof(struct message));
fun2(&ptr);
...
}
现在我们将消息存储在msgG和ptr中? 哪个更好?使用全局变量或访问指针,因为一个在堆中分配而另一个在bss中分配(不确定)? 有没有其他方法来处理这种情况?
答案 0 :(得分:3)
不要使用全局变量。您尝试做的事情可以这样做:
void fun2(struct message *ptr)
{
*ptr = msgCreate();
}
void fun1()
{
struct message *m = malloc(sizeof *m);
if (m == NULL) {
/* error handling */
}
fun2(m);
}
如果struct message
很大,请考虑没有返回此类struct
的函数。在大多数情况下,返回指向某个内存的指针比从函数返回一个大的自动变量更有效。
答案 1 :(得分:1)
避免使用全局变量是一种好习惯。
注意:如果您尝试在C中编写面向对象的代码,请查看此文档ooc.pdf
答案 2 :(得分:0)
可以这么简单:
struct message
{
void* data;
} msgG;
void fun2(struct message the_msg)
{
/* access the_msg.data */
}
void fun1()
{
struct message *ptr;
ptr = malloc(sizeof(struct message));
ptr->data = ... /* initialize it to something */
fun2(*ptr);
}
但是这样,fun2
将无法操纵the_msg
,因为它传递了结构副值的副本。它将能够操纵data
内the_msg
指针所指向的东西,因为那是指针。
如果你想操纵the_msg
本身的内容,比如重新定位data
指针,fun2
应该接受指向message
的指针(双指针是不必要的)为此)。
全局变量几乎总是一个糟糕的解决方案。不要使用它。