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直到纠正为止