簡體   English   中英

不使用 malloc 動態分配內存

[英]Dynamically allocating memory without using malloc

我一直在編寫一個程序,其中我有一個二維數組如果用戶需要,它可以改變大小,如下所示:

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

int max_length = 1024;
int memory_length = 16;
int block_length = 64;

void process_input(int memory[memory_length][block_length], char* user_input) {
    ...
}

int main(void) {
    printf("Not sure what to do? Enter 'help'\n");
    while (0 == 0) {
        int memory[memory_length][block_length];
        char user_input[max_length];
        printf(">> ");
        fgets(user_input, max_length, stdin);
        printf("\n");
        process_input(memory, user_input);
        if (user_input[0] == 'e' && user_input[1] == 'n' && user_input[2] == 'd') {
            break;
        }
        printf("\n");
    }
    return 0;
}

注意:我制作的 process_input() 函數允許用戶使用數組“內存”中的值以及更改memory_lengthblock_length的值,從而更改數組的長度。 用戶完成后,循環會用新數組重復。 我可以完美地使用二維數組,將其解析為任何函數。 然而有一天我發現有一些函數,例如 malloc() 允許您通過指針動態分配內存。 這讓我質疑:

我應該重寫我整個非常復雜的程序以使用 malloc 和其他“內存函數”,還是保持這種方式可以?

也作為可能通過回答主要問題來回答的附帶問題:

每次我聲明 2d 數組時,數組之前的內容是否被釋放,或者我是否像業余愛好者一樣不斷填滿我的記憶?

最后,如果您在代碼或我的文章中注意到任何其他內容,請告訴我。

謝謝。

我應該重寫我整個非常復雜的程序以使用 malloc 和其他“內存函數”,還是保持這種方式可以?

可能真的要重寫它。 int memory[memory_length][block_length]; 在 main() 中是一個可變長度數組 (VLA)。 它分配有自動存儲,並在遇到其聲明時獲取那些大小變量的大小,然后無法從那里調整大小。

出於某種原因,許多初學者似乎認為您可以通過更改最初用於確定其大小的變量來調整 VLA 的大小,但 VLA 和那些變量之間不存在這種神奇的關系。 如何正確聲明變長數組?

C 中唯一允許運行時調整大小的數組是動態分配的。 唯一的替代方法是分配一個“足夠大”的數組,然后跟蹤您正在使用的數組的數量——但它會位於內存中(這可能沒什么大不了的)。

但是,不建議使用自動存儲分配巨大的數組,因為它們通常會在堆棧上結束並可能導致堆棧溢出。 使用靜態存儲持續時間或分配的存儲(使用 malloc 等)。

每次我聲明 2d 數組時,數組之前的內容是否被釋放,或者我是否像業余愛好者一樣不斷填滿我的記憶?

您只能申報一次。 如果您在本地范圍內這樣做,並具有自動存儲持續時間,那么每次您離開聲明它的范圍時,它確實會被清除。 但這也意味着它不能在該范圍之外使用。

最后,如果您在代碼或我的文章中注意到任何其他內容,請告訴我。

是的,去掉全局變量。 在這個例子中沒有理由使用它們,像避免瘟疫一樣避免它們。 例如,使用已分配數組的函數可能會傳遞大小,如下例所示:

void process_input (size_t memory_length, 
                    size_t block_length,
                    int    memory[memory_length][block_length], 
                    char*  user_input)

在 C 中,局部變量,即在函數內聲明的變量,分配在堆棧上。 它們僅在首次調用函數時分配一次。 您可以在 while 循環中聲明變量這一事實可能會導致一些混亂。 循環不會以某種方式一次又一次地分配內存。

為所有局部變量分配的內存在函數返回時釋放。

您可能希望在循環內聲明變量的主要原因(除了方便之外)是為了限制變量的范圍。 在上面的代碼中,您無法在 while 循環之外訪問“內存”變量。 您可以輕松地自己檢查一下。 您的編譯器應該會引發錯誤。

堆棧或堆是否包含更多內存取決於您的計算機體系結構。 在嵌入式系統中,您通常可以指定是分配更多還是更少的內存給堆或棧。 在具有虛擬內存的計算機(例如 PC)上,堆和堆棧的大小僅受硬盤驅動器大小和地址空間的限制。

在堆上分配數組並不像看起來那么簡單。 一維數組的工作方式與您想象的一樣,但多維數組會使事情變得更加復雜,因此在您的情況下最好堅持使用本地或靜態聲明的數組。

暫無
暫無

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

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