有关传递函数中创建的变量的问题

时间:2009-12-14 04:19:10

标签: c pointers

假设存在一个返回消息的函数 说出以下格式:

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中分配(不确定)? 有没有其他方法来处理这种情况?

3 个答案:

答案 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,因为它传递了结构副值的副本。它将能够操纵datathe_msg指针所指向的东西,因为那是指针。

如果你想操纵the_msg本身的内容,比如重新定位data指针,fun2应该接受指向message的指针(双指针是不必要的)为此)。

全局变量几乎总是一个糟糕的解决方案。不要使用它。