了解malloc的常見用法

一、malloc函數的介紹和用法

malloc函數是C語言中的一種動態內存分配函數,它的聲明在stdlib.h中,函數原型如下:

void* malloc(size_t size);

其中size為申請內存的大小,返回值是指向void類型的指針,指向申請的內存起始地址。

使用malloc函數申請內存可以用於需要動態分配內存的程序,比如鏈表、數組等等。

二、malloc函數的基本使用

下面是一個簡單的基於C語言的malloc函數使用示例:

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

int main() {
    int *ptr;
    int num, i;
    
    printf("請輸入要申請的整數個數:");
    scanf("%d", &num);
    
    ptr = (int*) malloc(num * sizeof(int)); // 用malloc申請一段內存空間,大小為num個整數
    if (ptr == NULL)  // 如果申請失敗,輸出提示信息
    {
        printf("Memory allocation failed.\n");
        exit(1);
    }
    
    printf("請輸入%d個整數:\n", num);
    for (i = 0; i < num; i++)   // 輸入num個整數
    {
        scanf("%d", ptr + i);
    }
    
    printf("你輸入的%d個整數是:\n", num);
    for (i = 0; i < num; i++)   // 輸出num個整數
    {
        printf("%d ", *(ptr + i));
    }
    
    free(ptr);  // 釋放內存空間
    
    return 0;
}

該實例中為了在內存中存儲num個整數,使用了malloc函數,成功申請內存後,將返回一個指向int類型的指針,在使用過程中需要注意:

  • 及時釋放內存空間,避免內存泄漏
  • 必要時判斷申請內存的指針是否為空,以避免程序崩潰

三、calloc函數和realloc函數

malloc是C語言中常用的內存分配函數,但實際上C語言還有其他兩個常用的動態內存分配函數:calloc函數和realloc函數。

與malloc函數不同,calloc函數在分配內存時回把分配的內存空間清零。下面是一個基於C語言的calloc函數使用示例:

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

int main() {
    int *ptr;
    int num, i;
    
    printf("請輸入要申請的整數個數:");
    scanf("%d", &num);
    
    ptr = (int*) calloc(num, sizeof(int));  // 用calloc申請一段內存空間,大小為num個整數
    if (ptr == NULL)  // 如果申請失敗,輸出提示信息
    {
        printf("Memory allocation failed.\n");
        exit(1);
    }
    
    printf("請輸入%d個整數:\n", num);
    for (i = 0; i < num; i++)   // 輸入num個整數
    {
        scanf("%d", ptr + i);
    }
    
    printf("你輸入的%d個整數是:\n", num);
    for (i = 0; i < num; i++)   // 輸出num個整數
    {
        printf("%d ", *(ptr + i));
    }
    
    free(ptr);  // 釋放內存空間
    
    return 0;
}

calloc與malloc實際上用法是類似的,不過可以看到,calloc的第一個參數n表示要申請的內存塊數,而不是malloc的樣板參數。第二個參數size是內存塊的大小,返回值是一個指向void類型的指針。

realloc函數的作用是重新分配內存空間,即在原內存空間擴展或收縮一定的空間,下面是一個基於C語言的realloc函數使用示例:

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

int main() {
    int *ptr;
    int num, i;
    
    printf("請輸入要申請的整數個數:");
    scanf("%d", &num);
    
    ptr = (int*) malloc(num * sizeof(int)); // 用malloc申請一段內存空間,大小為num個整數
    if (ptr == NULL)  // 如果申請失敗,輸出提示信息
    {
        printf("Memory allocation failed.\n");
        exit(1);
    }
    
    printf("請輸入%d個整數:\n", num);
    for (i = 0; i < num; i++)   // 輸入num個整數
    {
        scanf("%d", ptr + i);
    }
    
    printf("你輸入的%d個整數是:\n", num);
    for (i = 0; i < num; i++)   // 輸出num個整數
    {
        printf("%d ", *(ptr + i));
    }
    
    printf("\n請輸入新的整數個數:");
    scanf("%d", &num);
    
    ptr = (int*) realloc(ptr, num * sizeof(int)); // 重新申請內存空間
    if (ptr == NULL)  // 如果申請失敗,輸出提示信息
    {
        printf("Memory allocation failed.\n");
        exit(1);
    }
    
    printf("請輸入%d個整數:\n", num);
    for (i = 0; i < num; i++)   // 輸入num個整數
    {
        scanf("%d", ptr + i);
    }
    
    printf("你輸入的%d個整數是:\n", num);
    for (i = 0; i < num; i++)   // 輸出num個整數
    {
        printf("%d ", *(ptr + i));
    }
    
    free(ptr);  // 釋放內存空間
    
    return 0;
}

可以看到,在使用realloc函數時,需要傳入原內存空間的指針和新的內存空間大小(即分配的字節數),如果操作成功,那麼該函數會返回新的指針值,指向從原始內存中複製過來的數據,原始內存將被釋放,以避免內存泄漏。

四、動態內存分配的優缺點

使用動態內存分配功能的優點:

  • 可以更加靈活地管理內存,在程序的運行過程中只有需要內存時才會得到申請,在不需要時及時釋放。
  • 可以節省程序的內存空間,增強程序的可讀性和可維護性。

使用動態內存分配功能的缺點:

  • 相較於靜態內存分配,需要更多的計算機處理時間。
  • 應用程序必須負責釋放所使用的動態內存,否則會導致內存泄漏。
  • 動態內存分配過多會導致內存碎片問題。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/159183.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-19 19:00
下一篇 2024-11-19 19:00

相關推薦

  • Python常見異常類型解析

    本文將闡述Python常見異常類型,包括其定義、分類及處理方法。 一、語法錯誤 語法錯誤是指在Python代碼編寫過程中出現的錯誤,這是一種最常見的錯誤類型。當Python解釋器無…

    編程 2025-04-27
  • Grep 精準匹配:探究匹配原理和常見應用

    一、什麼是 Grep 精準匹配 Grep 是一款在 Linux 系統下常用的文本搜索和處理工具,精準匹配是它最常用的一個功能。Grep 精準匹配是指在一個文本文件中查找與指定模式完…

    編程 2025-04-25
  • MySQL常見面試題

    一、基礎知識 1、MySQL的優點和缺點 MySQL是一個開源的關係型數據庫管理系統,擁有以下優點: (1)開源免費,可以節省成本; (2)支持多種操作系統; (3)易於使用和管理…

    編程 2025-04-24
  • 常見激活函數詳解

    一、Sigmoid函數 Sigmoid函數是最經典的激活函數之一,具有將實數映射到(0, 1)的特性,其公式如下: def sigmoid(x): return 1 / (1 + …

    編程 2025-04-23
  • JTextField:Java中常見的文本輸入框控件

    JTextField是Java Swing控件庫中的一種常見的用於文本輸入的控件,它提供了許多實用的特性與靈活的可擴展性。在本文中,我們將從多個方面對JTextField進行詳細的…

    編程 2025-04-22
  • 詳解stringutils.isempty的常見應用場景及內部實現

    一、簡介 stringutils.isempty是Apache commons-lang3庫中的一個實用函數,它用於判斷一個字符串是否為空或者null。在實際開發中,經常需要對字符…

    編程 2025-04-02
  • 常見端口詳解

    一、HTTP協議端口 HTTP協議端口為80。 HTTP協議(Hypertext Transfer Protocol,超文本傳輸協議)。主要用於Web瀏覽器和Web服務器之間的通信…

    編程 2025-02-24
  • React常見面試題詳解

    一、React 生命周期 1、生命周期簡介 React 生命周期是指 React 組件從實例創建到銷毀的整個過程。其中包含掛載、更新和卸載三個階段。 2、生命周期分類 React …

    編程 2025-02-05
  • 無鎖編程中的常見技術

    一、讀寫鎖(Read-Write Lock) 讀寫鎖允許多個讀取線程同時訪問共享資源,只要沒有線程試圖對資源進行寫操作。當有寫操作時,所有的讀取線程和寫入線程都必須等待寫入完成,然…

    編程 2025-02-05
  • new與malloc的區別和使用

    一、new和malloc的基本概念 new和malloc都是用於動態分配內存的函數。dynamic memory allocation是指在程序運行時動態分配內存,也稱堆分配(he…

    編程 2025-01-27

發表回復

登錄後才能評論