void J2(int* p, int n) {
int t = 0;
for (int m = 0; m < 10; m++) {
if (*(p + 11*m + n) != 0) ++t;
}
if (t == 1) {
for (int m = 0; m < 10; m++) {
if (*(p + 11*m + n) != 0) {
printf("\n%d", *(p + 11*m + n));
for (int n = 0; n < 11; n++) { // ⚠️ 內層循環變量遮蔽參數 n
*(p + 11*m + n) = 0;
}
break;
}
}
}
}
用戶反饋:「編譯時報錯不知道 p n 的」。
main 函數:C 程序入口必須有 main,單獨一個函數無法構建可執行文件,鏈接器報錯 undefined reference to 'main'。J2 被調用,參數 p(指針)、n(整數)從何而來?實參類型、值是否匹配?for (int n = 0; ...) 定義新變量 n 遮蔽了參數 n,導致 *(p + 11*m + n) 使用的是循環變量而非參數,**邏輯極大概率錯誤**。p 指向的內存是否合法分配?11*m+n 索引是否越界?
#include <stdio.h>
#include <stdlib.h>
void J2(int* p, int n) {
int t = 0;
for (int m = 0; m < 10; m++) {
if (*(p + 11*m + n) != 0) ++t;
}
if (t == 1) {
for (int m = 0; m < 10; m++) {
if (*(p + 11*m + n) != 0) {
printf("\n找到非零值: %d (位置 m=%d, n=%d)", *(p + 11*m + n), m, n);
// 修正:內層循環變量改名,避免遮蔽參數 n
for (int k = 0; k < 11; k++) {
*(p + 11*m + k) = 0;
}
break;
}
}
}
}
int main() {
// 模擬數據:10行 x 11列 的二維數組扁平化
int rows = 10, cols = 11;
int *data = (int*)calloc(rows * cols, sizeof(int));
if (!data) return 1;
// 設置幾個非零值測試
data[0*11 + 3] = 42; // 第0行第3列
data[5*11 + 7] = 100; // 第5行第7列
printf("測試 J2(data, 3) - 應找到第0行第3列的 42:\n");
J2(data, 3); // n=3,檢查第3列
printf("\n\n測試 J2(data, 7) - 應找到第5行第7列的 100:\n");
J2(data, 7); // n=7,檢查第7列
free(data);
return 0;
}
p 指向扁平化二維數組 [10][11],行主序。n 為**列索引**(0-10)。n 列是否**恰好有一個非零元素**(t==1)。若是,打印該值並將**該行所有元素清零**(k=0..10)。main 並調用函數,傳遞合法分配的指針和有效參數。k),避免遮蔽參數 n。n < 11,m < 10,指針非空。p 指向 [10][11] 扁平數組,n 為列號。
gcc -Wall -Wextra -std=c11 -o test test.c
./test
開啟 -Wall -Wextra 會警告「內層 n 遮蔽外層參數」,助你提前發現遮蔽 Bug。
「編譯時報錯不知道 p n 的」本質是**缺少完整程序上下文**(main、調用、實參構造)與**變量遮蔽邏輯錯誤**。補全 main、構造測試數據、修正遮蔽變量,即可編譯運行並驗證邏輯。養成「先寫 main 測試框架,再填函數實現」的開發習慣,避免孤立函數無法驗證。