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

C 語言以陣列指標為參數輸出陣列:避開字串結束符陷阱

     編輯:程式設計綜合問答

問題代碼分析

void cmdsend(unsigned int *info) {
    unsigned int k;
    for (k = 0; ((*info) != '\0') && (info != NULL); *info++, k++)
        printf("senddata is %d\r\n", *info);
}

陣列 senddata[2] = 0 被誤判為結束符 '\0',導致迴圈提早結束,僅輸出前兩個元素。

根本原因

  • 整數陣列不以 '\0' 結尾,這是 C 風格字串的慣例,不適用於 int/unsigned int 陣列。
  • 指標遞增 *info++ 修改了呼叫端的指標副本,且若超出邊界解參考會導致未定義行為。

正確做法:傳遞長度參數

void cmdsend(const unsigned int *info, size_t len) {
    for (size_t k = 0; k < len; ++k) {
        printf("senddata is %u\r\n", info[k]); // 或 *(info + k)
    }
}

// 呼叫端
unsigned int senddata[5] = {8, 2, 0, 4, 5};
cmdsend(senddata, 5); // 明確傳遞元素個數

進階:封裝結構體攜帶長度

typedef struct {
    unsigned int *data;
    size_t length;
} UIntArray;

void cmdsend(UIntArray arr) {
    for (size_t i = 0; i < arr.length; ++i)
        printf("%u ", arr.data[i]);
}

關鍵原則總結

  1. 整數/浮點數陣列永遠不以 '\0' 結尾,必須顯式傳遞長度。
  2. 函式參數用 const T* 表明唯讀,避免意外修改原始資料。
  3. 使用 size_t 表示長度/索引,符合標準庫慣例且避免負值。
  4. 邊界檢查:若長度來自外部輸入,函式內部應驗證 len > 0 && info != NULL。

遵循「指標+長度」慣例,是 C 語言處理陣列參數最安全、最通用的模式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved