簡體   English   中英

如何在C中使用malloc初始化靜態指針?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM