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

C 語言二級指標修改陣列導致崩潰的原因與修正

     編輯:程式設計疑難解答

錯誤現象

嘗試用二級指標 char ** 接收陣列 char (*)[100],編譯報錯 cannot convert parameter 1 from 'char (*)[100]' to 'char **',強制轉型執行時崩潰。

根本原因

  • 型別不相容:二維陣列 char arr[100] 退化為 char (*)[100](指向陣列的指標),而非 char **(指標的指標)。
  • 記憶體佈局不同:char ** 假設指向一個指標陣列,每個指標再指向字串;實際陣列是連續記憶體區塊。

正確做法:使用指標參考

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

int getMemBuf(char* &p2) { // C++ 參考語法,C 語言改用 char **p2
    char* tmp = (char*)malloc(100);
    strcpy(tmp, "aaabbbccc");
    p2 = tmp; // 修改呼叫端指標指向
    return 0;
}

int main() {
    char* buf = NULL;
    getMemBuf(buf);
    printf("%s\n", buf); // 輸出 aaabbbccc
    free(buf);
    return 0;
}

C 語言寫法(雙重指標)

int getMemBuf_C(char **p2) {
    char *tmp = malloc(100);
    strcpy(tmp, "aaabbbccc");
    *p2 = tmp; // 解參考賦值
    return 0;
}

int main() {
    char *buf = NULL;
    getMemBuf_C(&buf); // 傳遞指標位址
    printf("%s\n", buf);
    free(buf);
    return 0;
}

避坑指南

  1. 區分 char *p(字串指標)、char **p(指標的指標)、char (*p)[N](指向固定長度陣列的指標)。
  2. 函數需修改呼叫端指標指向時,參數用 T **(C)或 T* &(C++)。
  3. 動態分配記憶體後,務必在適當時機 free,避免洩漏。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved