2017-08-10 212 views
0

我有一個ptr變量在函數中更新。我想將這個變量傳遞給function2,這是在另一個.c文件中。 將靜態變量傳遞給不在同一個.c文件中的函數是合法的嗎?如果沒有static關鍵字,只保留全局ptr會更安全嗎?將靜態變量傳遞到函數

static Event * ptr = NULL; 

void function(Event * newPtr) 
{ 

    ptr = newPtr; 
    function2(ptr); 
} 

//in separate c file 
void function2(Event * pointer) 
{ 
    pointer->event = 2; 
} 
+2

是的,這是合法的。不管它是否「正確」取決於該功能對數據的作用。 – StoryTeller

+1

當你在一個函數調用中使用一個變量時,你並不真正傳遞這個變量本身,它只是* value *。或者說,它的價值*拷貝*。 –

+0

爲什麼'function2(ptr)'而不是'function2(newPtr)'直接? –

回答

1

靜態變量

static Event * ptr = NULL; 

不能從其他來源的文件中看到,但如果你把它作爲一個參數,它只是複製在堆棧上同其他指針,這樣你就可以這樣做的。

但我會通過它作爲const指針和明確文件說它是static變量爲他人。

void function2(Event * const pointer) 
{ 
    pointer->event = 2; 
} 
+1

爲什麼'const'和explicity會記錄它?這沒有理由。 – tilz0R

2

static符僅限制變量(internal linkage)的範圍。 但是,當您通過ptr時,將使用ptr中包含的地址,這是完全合法的(編譯時沒有問題,因爲您沒有使用變量ptr,您正在使用其中包含的值)。

但是在做這件事之前請三思,因爲如果其他人查看您的代碼時您聲明爲static,則會給人一種印象,即該變量僅在此文件中使用。如果function2中的代碼對傳入的指針做了任何操作(假設您已將內存動態分配給指針,並且它在function2中釋放,並且您試圖在您聲明ptr的文件中刪除/訪問)。

如果你照顧function2即將與指針做什麼,那麼它完全安全的做到這一點。但正如我上面提到的,這樣做不是一個好習慣。

0

你可以隨心所欲地做任何事情。靜態意味着全局存儲& &本地文件符號 l可見性。但變量可以隨意使用