首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C語言字串反轉兩法:指標法與陣列法,附堆/棧記憶體區別詳解

     編輯:關於C

前言

字串反轉是經典面試題。本文提供兩種標準實現——**指標雙向交換**(需動態分配)與**陣列原地交換**——並深度講解 malloc/free 堆記憶體管理、棧/堆區別、野指針防範,建立正確的記憶體操作肌肉記憶。

一、方法一:指標法(動態分配新緩衝區)


#include 
#include 
#include 

int main() {
    const char *src = "hello world";
    int len = strlen(src);

    // 1. 分配目標緩衝區(含結束符)
    char *dest = (char*)malloc(len + 1);
    if (!dest) return 1; // 分配失敗檢查

    char *d = dest;
    const char *s = &src[len - 1]; // 指向最後一個有效字元

    // 2. 反向複製
    while (len-- > 0) *d++ = *s--;

    *d = '\0'; // 手動添加結束符(關鍵!)

    printf("反轉結果: %s\n", dest); // dlrow olleh

    // 3. 釋放並置空(防野指針)
    free(dest);
    dest = NULL;
    return 0;
}

關鍵點:malloc 分配堆記憶體,free 歸還,ptr = NULL 防止懸空指針二次釋放/誤用。

二、方法二:陣列法(原地交換)


#include 
#include 

int main() {
    char str[] = "Hello world"; // 陣列在棧上,可修改
    int len = strlen(str);
    char tmp;

    for (int i = 0; i < len / 2; i++) {
        tmp = str[i];
        str[i] = str[len - i - 1];
        str[len - i - 1] = tmp;
    }
    printf("反轉結果: %s\n", str); // dlrow olleH
    return 0;
}

優勢:無動態分配開銷,無記憶體洩漏風險,適合固定緩衝區場景。

三、堆 vs 棧:核心區別速查表

四、常見錯誤與避坑指南

  1. 忘記 +1 給結束符 → malloc(len) 導致寫越界。
  2. 忘記手動添加 \0 → printf("%s") 讀越界亂碼。
  3. 釋放後未置 NULL → 野指針,後續誤用觸發崩潰/安全漏洞。
  4. 對字串常量修改:char *p = "abc"; p[0]='x'; → 未定義行為(常量區不可寫)。正確:char p[] = "abc"; 或 const char *p = "abc";。
  5. 棧上大陣列:char buf[1000000]; → 棧溢位。改用 malloc 或 static。

五、總結

字串反轉看似微末,實則考驗指標算術、記憶體管理規範、堆棧認知。指針法展示動態分配全流程,陣列法演示原地演算法優雅。養成「分配檢查、結束符補全、釋放置空、常量 const」四步驟,遠離記憶體 Bug。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性堆棧
管理方式程式設計師手動 malloc/free / new/delete編譯器/作業系統自動分配釋放
空間大小巨大(GB級,受限於虛擬記憶體)較小(通常 1~8MB,線程棧)
分配速度較慢(系統呼叫、碎片管理)極快(指針遞增/遞減)
生命週期手動控制,跨函數共享隨作用域進出自動管理
典型用途動態資料結構、大塊緩衝區、跨模組共享區域變數、函數參數、返回地址、臨時緩衝區
C/C++ 對應malloc/free, new/delete自動變數、alloca (非標準)