首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言動態字符數組:malloc/new 分配、長度驗證與內存釋放完整示例

     編輯:程式設計綜合問答

需求

用戶輸入長度 n,動態分配字符數組,讀取字符串並驗證長度是否超標。

C 風格

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

int main() {
    int n;
    printf("請輸入最大長度:");
    scanf("%d", &n);
    getchar(); // 吸收換行

    char *p = (char *)malloc(n + 1); // +1 存 \0
    if (!p) { perror("malloc"); return 1; }

    printf("請輸入字符串:");
    fgets(p, n + 1, stdin); // 安全讀取,含換行
    p[strcspn(p, "\n")] = '\0'; // 去掉換行

    if (strlen(p) > n) {
        printf("長度超標!實際:%zu,限制:%d\n", strlen(p), n);
    } else {
        printf("合法:%s\n", p);
    }
    free(p);
    return 0;
}

C++ 風格

#include <iostream>
#include <string>
int main() {
    size_t n;
    std::cin >> n;
    std::cin.ignore();
    std::string s;
    std::getline(std::cin, s);
    if (s.length() > n) std::cout << "超標\n";
    else std::cout << s << '\n';
    return 0;
}

關鍵點

  • C 語言**必須手動 `malloc`/`free`**,檢查返回值防 OOM。
  • 分配 `n+1` 字節留給終止符 `\0`。
  • 用 `fgets` 而非 `gets`/`scanf("%s")` 防緩衝區溢出。
  • C++ 首選 `std::string` 自動管理內存,無需手動釋放。

常見錯誤

  • 忘記 `free` → 內存洩漏。
  • 用 `delete[]` 釋放 `malloc` 內存(或反之) → 未定義行為。
  • 讀取時未限制長度 → 棧/堆溢出。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved