C 关于传递函数中创建的变量的问题
假设存在一个返回消息的函数 请说出以下格式:C 关于传递函数中创建的变量的问题,c,pointers,C,Pointers,假设存在一个返回消息的函数 请说出以下格式: struct message { void* data; }msgG; 哪种方法是提取数据的最佳方法(即在代码中获取fun1可访问的消息): 1-使用全局变量 2-使用双指针(指针指向指针) 现在我们已经将消息存储在msgG和ptr中了? 哪个更好?使用全局变量或访问指针,因为一个在堆中分配,另一个在bss中分配(不确定)?? 有没有其他方法来处理这种情况?可以这么简单: struct message { void* data; } msgG;
struct message
{
void* data;
}msgG;
哪种方法是提取数据的最佳方法(即在代码中获取fun1可访问的消息):
1-使用全局变量
2-使用双指针(指针指向指针)
现在我们已经将消息存储在msgG和ptr中了?
哪个更好?使用全局变量或访问指针,因为一个在堆中分配,另一个在bss中分配(不确定)??
有没有其他方法来处理这种情况?可以这么简单:
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
将无法操作消息,因为它通过值传递了结构的副本。它将能够在消息
中操纵数据
指针指向的内容,因为这是一个指针
如果您想操作消息本身的内容,例如重新定位数据
指针,fun2
应该接受指向消息
的指针(不需要双指针)
而全局变量几乎总是一个糟糕的解决方案。不要使用它。它可以像这样简单:
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
将无法操作消息,因为它通过值传递了结构的副本。它将能够在消息
中操纵数据
指针指向的内容,因为这是一个指针
如果您想操作消息本身的内容,例如重新定位数据
指针,fun2
应该接受指向消息
的指针(不需要双指针)
而全局变量几乎总是一个糟糕的解决方案。不要使用它。避免使用全局变量是一个很好的做法
注意:如果您试图用C编写面向对象的代码,请参阅本文档避免使用全局变量是一种很好的做法
注意:如果您试图用C编写面向对象的代码,请参阅本文档,不要使用全局变量。您试图做的事情可以通过以下方式完成:
void fun2(struct message *ptr)
{
*ptr = msgCreate();
}
void fun1()
{
struct message *m = malloc(sizeof *m);
if (m == NULL) {
/* error handling */
}
fun2(m);
}
<> > <代码>结构消息>代码>大,考虑没有返回这样的<代码>结构> <代码>的函数。在大多数情况下,返回指向某个内存的指针比从函数返回大的自动变量更有效。不要使用全局变量。您试图做的事情可以通过以下方式完成:
void fun2(struct message *ptr)
{
*ptr = msgCreate();
}
void fun1()
{
struct message *m = malloc(sizeof *m);
if (m == NULL) {
/* error handling */
}
fun2(m);
}
<> > <代码>结构消息>代码>大,考虑没有返回这样的<代码>结构> <代码>的函数。在大多数情况下,返回指向某个内存的指针要比从函数返回一个大的自动变量更有效。您能提供多一点上下文吗?我不确定我是否对这种情况了解得足够多,无法给出意见。@juan:msgCreate()通常类似于网络程序中的recv()。我正在处理一条收到的信息。你能给我一点背景吗?我不确定我是否对这种情况了解得足够多,无法给出意见。@juan:msgCreate()通常类似于网络程序中的recv()。我在用abt处理收到的信息。@eliben:那我们什么时候才能使用双指针呢。我以前认为它是用在这些situations@tomkaith13:必须修改指针而不是其内容时,使用双指针。一种情况是,您希望函数创建指向某个对象的新指针,并将自己的指针作为参数传递给它。@tomkaith13:有关双指针的详细信息:,还有@eliben:我有点困惑,fun2()不应该具有类似于fun2(struct message*the_msg)
的参数吗。正如中所述,它应该使用标记名“message”而不是“msgG”,然后它应该是指向该类型的指针,因为这是用fun2(ptr)传递给它的-1至corrected@eliben:那么我们什么时候才能真正使用双指针呢。我以前认为它是用在这些situations@tomkaith13:必须修改指针而不是其内容时,使用双指针。一种情况是,您希望函数创建指向某个对象的新指针,并将自己的指针作为参数传递给它。@tomkaith13:有关双指针的详细信息:,还有@eliben:我有点困惑,fun2()不应该具有类似于fun2(struct message*the_msg)
的参数吗。正如中所述,它应该使用标记名“message”而不是“msgG”,然后它应该是指向该类型的指针,因为这是用fun2(ptr)传递给它的-1直到纠正为止