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

相关推荐
noipp1 小时前
推荐题目:洛谷 P16510 [GKS 2015 #C] gRanks
java·c语言·开发语言·c++·python·算法
flyinmind1 小时前
Java环境与Android环境中使用QuickJS
java·开发语言·javascript·quickjs
郑洁文1 小时前
基于Python的HTTP服务漏洞信息收集工具设计与实现
开发语言·python·http
程序喵大人1 小时前
从内存/汇编角度看C与C++:指针、引用、对象的底层差异
c语言·汇编·c++·指针·引用·对象
不吃鱼的羊1 小时前
DaVinci Developer自动连接
java·开发语言
Evand J1 小时前
【MATLAB例程】VSIMM与IMM在机动目标跟踪中的性能对比,CV+CT双模型
开发语言·matlab·目标跟踪
菜菜的顾清寒1 小时前
力扣HOT100(50)动态规划-零钱兑换
算法·leetcode·动态规划
Meteors.1 小时前
Kotlin协程序使用技巧和应用场景
android·开发语言·kotlin
周末也要写八哥1 小时前
三分钟读懂:如何解决做题数量不足的问题?
算法