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

C 語言字串字面值與指標:記憶體佈局圖解

     編輯:程式設計綜合問答

代碼

char *s2 = "hello world";

記憶體模型

+----------------+      +----------------------------------+
|  s2 (棧上)     | ---> |  "hello world\0" (唯讀資料段)    |
|  類型: char*   |      |  地址: 0x400000 (假設)            |
|  值: 0x400000  |      |  內容: h e l l o   w o r l d \0 |
+----------------+      +----------------------------------+

關鍵點

  1. s2 存儲的是首字元 'h' 的地址,而非字串內容本身。
  2. 字串字面值存放在唯讀區 (`.rodata`),嘗試修改 `s2[0] = 'H';` 導致未定義行為 (通常 Segfault)。
  3. printf("%s", s2); 從地址連續讀取直到 \0,輸出完整字串。
  4. printf("%p", s2); 輸出地址值 (如 0x400000)。
  5. printf("%c", *s2); 解引用得 'h'。

對比:陣列初始化

char s3[] = "hello world"; // 棧上分配 12 位元組,內容可修改
// 等價於 char s3[12] = {'h','e','l','l','o',' ','w','o','r','l','d','\0'};
  • sizeof(s2) = 指標大小 (4/8 位元組)。
  • sizeof(s3) = 12 位元組。

最佳實踐

僅讀字串用 const char *s = "...";;需修改時用陣列或 malloc + strcpy。

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