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

C語言指標未初始化導致「記憶體不可讀」經典案例分析與修正

     編輯:C 語言問答

錯誤代碼核心片段


int a[3][3], b[3], c[3], d[3], i, j, *m;
// ...
for (j = 0; j <= 2; j++, m++) scanf("%d", m);  // m 未初始化!

錯誤根因

  • int *m; 僅宣告指標變數,**未賦予任何合法地址**,其值為隨機垃圾值 (棧上殘留)。
  • scanf("%d", m) 嘗試向隨機地址寫入 → **段錯誤 / 記憶體不可讀/寫**。

正確指標使用三原則

  1. 指向現有物件:m = &a[0][0]; 或 m = a[0]; (陣列退化為首元素指標)。
  2. 動態分配:m = malloc(N * sizeof(int)); 使用後 free(m);。
  3. 字串字面量:const char *s = "hello"; (唯讀)。

修正版:完全用陣列下標 (更簡單、安全)


#include <stdio.h>

int main() {
    int a[3][3], b[3], c[3], d[3], i, j;

    printf("請輸入 3x3 矩陣:\n");
    for (i = 0; i < 3; i++)
        for (j = 0; j < 3; j++)
            scanf("%d", &a[i][j]);

    // 轉置:b=第0列, c=第1列, d=第2列
    for (i = 0; i < 3; i++) {
        b[i] = a[i][0];
        c[i] = a[i][1];
        d[i] = a[i][2];
    }

    // 寫回 a (轉置後)
    for (i = 0; i < 3; i++) {
        a[0][i] = b[i];
        a[1][i] = c[i];
        a[2][i] = d[i];
    }

    printf("轉置後:\n");
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 3; j++) printf("%d ", a[i][j]);
        putchar('\n');
    }
    return 0;
}

指標版修正 (教學演示)


int *m = &a[0][0];  // 指向首元素
for (i = 0; i < 3; i++) {
    for (j = 0; j < 3; j++) {
        scanf("%d", m + i*3 + j);  // 計算偏移
    }
}
// 其餘邏輯同理用指標算術

避坑口訣

  • **宣告即初始化**:int *p = NULL; 或 int *p = &var;。
  • **用前檢查**:if (p) { *p = ...; }。
  • **釋放後置 NULL**:free(p); p = NULL;。
  • **優先用陣列/容器**:現代 C/C++ 能用 std::vector/std::array 絕不手寫指標算術。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved