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

C語言字符串數組定義:指針數組與二維數組的區別及 gets() 使用陷阱

     編輯:程式設計綜合問答

問題背景

在 C 語言中,定義字符串數組時常見兩種寫法:

char *ptr[10];   // 指針數組
char ptr[10][20]; // 二維數組

初學者常困惑:為什麼第一種配合 gets(ptr[0]) 會運行出錯,而第二種卻正常?

核心區別

1. char *ptr[10] —— 指針數組

這定義了一個包含 10 個 char* 指針的數組。每個指針初始化為野指針(未指向有效內存)。調用 gets(ptr[0]) 時,試圖向未分配的內存寫入數據,導致未定義行為(通常是段錯誤)。

2. char ptr[10][20] —— 二維數組

這在棧上連續分配了 10 × 20 = 200 個字節的內存空間,每行固定 20 個字符。ptr[0] 直接指向第一行的首地址,gets(ptr[0]) 寫入的是已分配的合法內存,因此正常工作。

類比理解

這類似於一維情況下的 int *p; 與 int a[10];:前者只是指針,需先 malloc 或指向現有變量;後者自帶存儲空間。

正確使用指針數組的方法

若必須用 char *ptr[10],需為每個指針分配內存:

for (int i = 0; i < 10; ++i) {
    ptr[i] = malloc(20 * sizeof(char)); // 或指向靜態緩衝區
}
gets(ptr[0]); // 現在安全了
// 使用後記得 free

總結

  • 二維數組:編譯時靜態分配連續內存,開箱即用,適合固定最大長度的字符串集合。
  • 指針數組:僅存儲地址,需手動管理指向的內存(堆/棧/靜態區),靈活但易出錯。
  • gets():已被 C11 棄用,不安全;實際開發請改用 fgets() 並指定長度。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved