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

相关推荐
4311媒体网16 分钟前
帝国CMS网站自定义搭建技巧
服务器·开发语言·前端
_Narcissus_17 分钟前
链表算法题和静态链表
数据结构·c++·笔记·算法·链表·ai·力扣
布莱克60521 分钟前
C++拷贝构造与拷贝赋值运算符的区别详解
开发语言·c++
Lyyaoo.34 分钟前
【普通数组】【中等】除了自身以外数组的乘积
数据结构·算法·leetcode
lhldsg39 分钟前
全民健身解决方案:从共享球场到智能运营的技术实践
java·大数据·开发语言·需求分析
threerocks44 分钟前
《The AI-Native SDLC Playbook》万字拆解
算法·aigc·ai编程
夏玉林的学习之路1 小时前
算法8.环形队列
算法
归去来?1 小时前
Python 常用优雅写法
开发语言·python
Yyyyyy~1 小时前
【C语言】数据类型和变量【下】
c语言
devilnumber1 小时前
Java 30 组高频技术 / 知识点多角度对比
java·开发语言