[英]How to initialize static pointer with malloc in C?
我正在嘗試使用C中的malloc初始化一個靜態變量(在函數內部),但是我遇到了“初始化不是常量錯誤”。 我知道我無法使用C中的非常量來初始化靜態對象,但是誰能想到解決方案? 我需要代碼具有與以下相同的效果:
static int *p = (int *)malloc(sizeof(int));
有技巧/解決方法嗎?
編輯:我有一個函數,每當一個標志變高。 在此函數中,我正在創建並啟動一個新線程。 我聲明一個指向結構的指針,並使用malloc分配內存,然后將此指針傳遞給線程。 然后該函數返回控制。 當我重新輸入該函數時,最初打開的線程仍將運行,並且我希望能夠訪問最初傳遞給該線程的內存區域。 這就是為什么我需要一個靜態變量,以便可以在第一個調用中進行malloc,然后在后續調用中使用相同的地址。 這樣我可以從線程中獲取信息。 所有這些避免使用全局變量。
static int *p = NULL;
if(!p) p = (int *)malloc(sizeof(int));
假設您需要函數靜態變量:
int foo(void) {
static int b=1;
static int *p;
if (b) {
p = malloc(sizeof(int));
b = 0;
}
...
}
您可以將p的NULL值用作檢查,只要您知道在第一次調用之后它就永遠不會為NULL
。
記住要檢查malloc中的錯誤。 它是運行時分配,並且在不再需要時也應將其釋放。
malloc()
僅用於在運行時分配內存。 靜態變量在有空時進行初始化。 你要:
static int p[1];
如果它是靜態文件,則應在該文件中提供一個公共函數,以初始化該靜態文件。
void initialize () {
if (p == 0) p = malloc(sizeof(*p));
}
或者,您可以使用靜態函數代替靜態變量。 不過,每次訪問都需要您支付一筆檢查費用:
static int * p () {
static int * p_;
return p_ ? p_ : (p_ = malloc(sizeof(*p_)));
}
對於整數類型,這似乎有點愚蠢,但是如果p
是某種更復雜的類型,而不僅僅是malloc()
的返回值,則需要更復雜的初始化序列,那么具有這樣的含義可能是有意義的。
C無法做到這一點。 C ++可以使用靜態構造函數。
您可以在main()或需要指針之前調用的任何其他函數中首先進行分配。
雖然不可移植,但某些可執行文件格式(例如Classic Mac OS的代碼片段管理器)支持初始化/終止入口點。 CFM初始化用於C ++靜態構造。 如果平台上的可執行文件格式支持初始化入口點,則可以使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.