2009-12-14 47 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

相關問題