C语言中字符串常量存储位置

核心区别在于内存存储位置不同

核心原因

变量 存储位置 比较的是什么 结果
str1[]str2[] 栈区 数组的地址(不同位置) 不相等
str3str4 常量区 指向同一个常量字符串的地址 相等

详细解释

1️⃣ char str1[] = "hello bit.";

c

复制代码
char str1[] = "hello bit.";  // 在栈上开辟数组,把字符串"拷贝"进去
char str2[] = "hello bit.";  // 在栈上开辟另一个数组,再拷贝一份

内存布局:

text

复制代码
栈区:
str1 → [h][e][l][l][o][ ][b][i][t][.][\0]  (地址:0x100)
str2 → [h][e][l][l][o][ ][b][i][t][.][\0]  (地址:0x200)
  • str1str2 是两个不同的数组

  • 虽然内容相同,但地址不同

  • str1 == str2 比较的是地址 → 不相等


2️⃣ const char* str3 = "hello bit.";

c

复制代码
const char* str3 = "hello bit.";  // 指向常量区的字符串
const char* str4 = "hello bit.";  // 指向同一个常量字符串

内存布局:

text

复制代码
常量区(只读):
0x5000: [h][e][l][l][o][ ][b][i][t][.][\0]
           ↑                    ↑
        str3                   str4
        (存的是 0x5000)        (存的也是 0x5000)
  • 字符串字面量 "hello bit." 存储在常量区(只读)

  • 编译器会优化:相同内容的字符串字面量只存一份

  • str3str4 都指向同一个地址

  • str3 == str4 比较的是地址 → 相等


图解对比

text

复制代码
┌─────────────────────────────────────────┐
│              栈区                        │
│  ┌──────┐     ┌─────────────────────┐   │
│  │ str1 │────→│ h e l l o   b i t . \0 │   │
│  └──────┘     └─────────────────────┘   │
│  ┌──────┐     ┌─────────────────────┐   │
│  │ str2 │────→│ h e l l o   b i t . \0 │   │
│  └──────┘     └─────────────────────┘   │
│         (两块不同的内存,内容相同)        │
└─────────────────────────────────────────┘

┌─────────────────────────────────────────┐
│              常量区                      │
│  ┌────────────────────────────────────┐ │
│  │ h e l l o   b i t . \0             │ │
│  └────────────────────────────────────┘ │
│         ↑                    ↑          │
│      str3                  str4         │
│    (指向同一块内存)                    │
└─────────────────────────────────────────┘

如何比较字符串内容?

如果要比较字符串内容 是否相同,要用 strcmp()

c

复制代码
#include <string.h>

if (strcmp(str1, str2) == 0)
    printf("内容相同\n");  // 这个会执行

总结

写法 存储位置 比较结果
char arr[] = "..." 栈区(每次拷贝) 地址不同 → 不相等
char* p = "..." 常量区(共享) 指向同一地址 → 相等

一句话str1str2 是两份拷贝,str3str4 指向同一份常量字符串。

相关推荐
复杂网络1 小时前
论最小 Agent 计算机的形态
算法
kisshyshy16 小时前
🍦 雪糕、食堂、火车厢:三幅漫画吃透栈、队列与链表
javascript·算法
猿人谷1 天前
不只是 CPU 阈值:STAR 如何用 GAT + Transformer 做容器级自动扩缩容?
人工智能·算法
复杂网络1 天前
Stable Diffusion 视觉大模型微调技术深度调研
算法
复杂网络1 天前
基于 Stable Diffusion 架构的视觉大模型代表性工作与原理深度解析
算法
MrZhao4001 天前
Agent Loop 如何用 Hook 扩展:权限、日志与工具拦截
算法
MrZhao4001 天前
Agent 为什么需要 Skills:别把所有知识都塞进 system prompt
算法
JieE2122 天前
LeetCode 101. 对称二叉树|JS 递归 + 迭代双解法,彻底搞懂镜像判断
javascript·算法
JieE2123 天前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
Jack204 天前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法