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 指向同一份常量字符串。

相关推荐
大尚来也20 小时前
用 Python 自动整理文件、重命名、分类电脑文件夹
开发语言·python
CVer儿20 小时前
c++二级指针
开发语言·c++
极序时代GEO品牌优化20 小时前
杭州极序时代|面向地域、设备与用户画像的动态GEO
人工智能·python·算法·极序时代geo
mlidongfeng21 小时前
[AI][C++26] SIMD 编程模型思考
开发语言·c++·人工智能
j7~21 小时前
【Linux】二十七.线程篇四《Linux多线程编程:线程互斥(互斥量的底层到封装)、线程安全和冲入、死锁》---详解
linux·开发语言·c++·线程安全·死锁·线程互斥·重入
啦啦啦啦啦zzzz21 小时前
贪心算法和动态规划
c++·算法·贪心算法·动态规划
刘名喜21 小时前
第09篇-协程基础-Kotlin异步编程
开发语言·kotlin·springboot
其实防守也摸鱼21 小时前
HackBar 工具完全指南:信息探测、漏洞验证与安全测试实战
开发语言·人工智能·学习·安全·网络安全·安全威胁分析·安全性测试
happyprince21 小时前
篇3:bitsandbytes-深刻观-哲学与升华
人工智能·算法
应用市场21 小时前
红绿灯背后的算法:从 Webster 配时到 Max-Pressure 与强化学习
算法