2009-12-14 95 views
0

假设存在一个用来返回以下格式的消息 说一个函数:关于产品传递一个函数创建一个变量

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

你能否给出更多的上下文?我不确定我是否足够了解情况以提出意见。 – Juan 2009-12-14 04:26:56

+0

@juan:msgCreate()通常像一个来自网络程序的recv()。 我在说abt处理收到的消息。 – tomkaith13 2009-12-14 04:32:44

回答

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。在大多数情况下,返回指向内存的指针比从函数返回大的自动变量更有效。

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,因为它通过了价值结构的副本。它将能够操作the_msgdata指针指向的内容,因为这是一个指针。

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

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

+0

@eliben:那么我们什么时候准确使用双指针。我曾经认为它在这种情况下使用 – tomkaith13 2009-12-14 04:35:24

+0

@ tomkaith13:当*指针*必须被修改时使用双指针,而不是其内容。一种情况是当你想要一个函数来创建一个指向某个东西的新指针时,并且将自己的指针作为参数传递给它。 – 2009-12-14 04:52:27

+0

@ tomkaith13:更多关于双指针:http://stackoverflow.com/questions/758673/uses-for-multiple-levels-of-pointer-dereferences,还http://stackoverflow.com/questions/897366/如何做指针指针工作in-c – 2009-12-14 04:55:16

1

避免使用全局变量是一种很好的做法。

注意:如果你试图代码的面向对象的C,看看这个文件ooc.pdf

相关问题