簡體   English   中英

malloc有什么用? 為什么不……不使用它呢?

[英]What is the use of malloc? Why not just… not use it?

我正在學習有關學習C的本教程 ,內容如下:

假設我們要動態分配人員結構。 該人的定義如下:

 typedef struct { char * name; char age; } person; 

要在myperson參數中分配一個新人,我們使用以下語法:

 person * myperson = malloc(sizeof(person)); 

他們為什么這樣做呢? malloc帶給您什么好處?

以下代碼可以編譯,並且看起來可以正常運行:

typedef struct {
    char * name;
    char age;
} person;

person p;
p.name = "Henry";
p.age = 9;

printf("%s is %d", p.name, p.age);

我很困惑為什么要使用malloc

malloc至少在以下三種情況下使用:

  1. 在構建數組時,創建的元素數不是先驗的或變量是已知的(盡管C99允許定義數組的運行時大小)。 作為特殊情況,使用可變長度的char字符串。
  2. 當請求非常大的內存塊時,該內存塊不適合堆棧,作為全局變量的替代方法。
  3. 每當需要動態管理內存時,即顯着而急切地分配和釋放內存以減少占用空間。

但這並不是編程所必需的。

當然,沒有它,將很難實現許多事情,但是,這並不是絕對必要的。 實際上,某些特殊應用的編碼樣式(例如航空電子設備的DO-178B)實際上禁止使用它。

Malloc提供了靈活性,可以動態分配內存並在需要時使用它,並在不需要時釋放它。 在上述情況下,分配給人p的內存將保留到堆棧末尾。 您可能在當前示例中找不到它的用途。 但是在許多情況下,動態分配內存是有意義的。

提供的示例並沒有真正顯示出“ malloc”的全部功能,就這么簡單。

考慮一個您不知道最大金額的應用程序,比方說一個銀行帳戶...(在此示例中,金錢只是整數)

現在,您是一名程序員,因此余額可以按16位數字存儲在兩個帳戶中:

unsigned int * array = malloc(2 * sizeof(unsigned int)); //This allows the array 
                                                         //to have two indexes.

現在,假設我們現在需要添加另一個帳戶...

如果我們還不聰明並使用過malloc,那我們就被塞滿了。

但是,我們現在可以說:

realloc(3 * sizeof(unsigned int));

並添加更多的銀行帳戶:)

另一種看待這種情況的方法是, why use a pointer to my struct rather than just the struct ,因為當您想到malloc() ,您會想到指針。 使用指針以及malloc()好處之一是調用函數時的開銷。 當您的數據結構變得更加復雜時,將它們作為參數傳遞給函數時,它們的開銷將會增加。 解決此問題的一種方法是只將指針傳遞給您的結構,然后在函數中取消引用該結構。

void printfStruct(struct myStruct) 
{
    printf("%s", myStruct.name);
    // no pointer passed, overhead created on larger data structures
}

void printfStruct(struct *myStruct)
{
    printf("%s", myStruct->name);
    // pointer passed, then dereferenced. Decreased overhead on larger data structures.
}

Malloc用於在運行時分配內存。 如果不確定確切的人數,則可以在運行時確定人數,並可以為其分配合適的內存。

malloc連續分配內存...即,您可以執行指針算術

當您想釋放內存時,您可以給出free(),這將釋放整個內存塊,而不管大小太大或太小。

還要注意,malloc沒有任何默認值,因此默認情況下它包含垃圾值...如果要將默認值設置為零,請使用calloc而不是malloc。

如果沒有連續的可用空間,則malloc返回null值,因此在這種情況下無法分配內存

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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