2011-10-31 24 views
0

我在下面有這個代碼(非常非常簡化)。全局變量的套接字更改地址

#include "test1.h" 
#include <stdlib.h> 
#include <stdio.h> 

extern struct1 *p; 

int funct1() 
{ 
    p = (struct1 *)malloc(sizeof(p)); 
    p->foo = 2; 
    printf("value of foo in funct 1 is %d\n", p->foo); 
    funct2(); 
} 

int funct2() 
{ 
    /*here do a lot of stuffs, mainly open socket, 
     send some params, and close. 
     Struct1 is not touched at all here*/ 
} 

int funct3() 
{ 
    printf("value of foo in funct 3 is %d\n", p->foo); 
} 

int funct4() 
{ 
    /*here listen to certain port, and execute funct4 
     if UDP is send to certain port*/ 
    funct3(); 
} 

int main() 
{ 
    funct1(); 
    funct3(); 
} 

---- test1.h

typedef struct 
{ 
    int foo; 
}struct1; 

struct1 *p = 0; 

int funct1(); 
int funct2(); 
int funct3(); 
int funct4(); 

這樣做的問題是,我不知怎麼損壞地址:在funct1的地址,例如:「20003001」,但當我設置偵聽某個端口並調用funct3的套接字時,foo變爲「20003010」。它轉移了一點點。

因此簡化, 1.我在函數的foo賦值1 2.通話本功能2,做了很多東西與插座不從struct1 3.使用任何如果消息達到一定端口,由funct4調用功能3 4.功能3打印foo

唯一想到的是使用全局變量,但顯然這是瘋狂的,因爲它可能發生在內存中的損壞。我無法將指針從funct 1,2,3傳遞給struct,因爲有很多其他函數,只有funct 1和3需要使用這個指針。

有沒有人有任何想法,我怎麼可以在funct3中訪問「foo」而不會在全局變量中發生任何損壞?

感謝您的任何意見

+0

我認爲你的結構是八字節的大小?因爲如果是這樣的話,那麼funct1()的某個地方會被再次調用並重置* p。我不認爲這是內存腐敗和其他問題一樣,如果p只是嚴格用於funct1和funct3 ...我建議將它重命名爲其他地方不用的東西,以便您可以確定p是否已在別處設置。 –

+0

@AhmedMasud:這是一個簡化的函數,實際的代碼由一個列表和一些其他參數組成。但問題在於訪問全局變量,在套接字被編譯後改變其地址 – heike

+0

好吧,那麼你可以分享套接字開放代碼嗎? –

回答

1

p是一個指針,所以如果你想分配一個struct1,你需要做的

p = (struct1 *)malloc(sizeof(struct1)); 

雖然有可能是因爲您分配一個等效的東西大小,在內存分配過程中「改變類型」甚至混淆類型是不可取的。當它出錯時,壞事真的會發生。

+1

你不需要施加'malloc'的結果,而且它只需要是'p = malloc(sizeof(* p));' –

+1

如果是C++,我相信你會這樣做,但如果它是C.我養成了用兩種語言做這件事的習慣,因爲它沒有額外花費(而且更清楚一些)。 –

2
p = (struct1 *)malloc(sizeof(p)); 

只分配4或8字節(系統/操作系統相關);一個指針的大小到一個結構。您需要分配內存來保存結構本身:

p = malloc(sizeof(*p)); 

您也不需要投射malloc的結果。