1、字符串字面量的存储位置
字符串字面量通常存储在程序的 只读数据段(Read-Only Data Segment),而不是栈或堆中。这是因为字符串字面量在程序的生命周期内是常量,并且通常在编译时就被确定。这样做的目的是为了优化内存使用,避免多次创建相同的字符串副本。
#include <stdio.h>
int main() {
// 字符串字面量存储在只读数据段
const char *str = "Hello, World!";
printf("字符串内容: %s\n", str);
printf("字符串字面量的地址: %p\n", (void*)str);
// 修改字符串字面量是不允许的
// str[0] = 'h'; // 编译时会报错:不能修改字符串字面量
return 0;
}
字符串字面量存储位置
#include <stdio.h>
int main() {
const char *str1 = "Hello";
const char *str2 = "Hello";
// 判断两个字符串字面量是否相等
if (str1 == str2) {
printf("Both strings point to the same location.\n");
}
return 0;
}
2、字符串字面量与指针
在 C/C++ 中,字符串字面量的类型是 const char[]
,因此它是一个常量字符数组。字符串字面量(string literals)和指针有紧密的关系。字符串字面量在内存中是以常量字符数组的形式存储的,因此可以通过指针访问字符串的内容。
#include <stdio.h>
int main() {
// 字符串字面量
const char *str = "Hello, World!";
// 使用指针打印字符串
printf("String: %s\n", str);
// 通过指针逐个字符访问字符串
while (*str != '\0') {
printf("%c ", *str);
str++; // 移动指针到下一个字符
}
printf("\n");
return 0;
}
3、字符串字面量存储与栈、堆的区别
局部变量会存储在栈中,而字符串字面量不会。栈内存是由编译器自动分配和释放的临时内存区域。可以使用 malloc
或 new
在堆上动态分配内存,这与字符串字面量的存储位置无关。
1)栈存储
栈是用于存储局部变量的区域。当函数被调用时,栈上为局部变量分配内存,函数返回时,栈上的内存会自动释放。
#include <stdio.h>
void example() {
char str[] = "Hello, Stack!"; // 局部字符串变量
str[0] = 'h'; // 修改栈上的字符串
printf("%s\n", str); // 输出修改后的字符串
}
int main() {
example(); // 调用函数,打印 "hello, Stack!"
return 0;
}
2)堆存储
堆是用于动态内存分配的区域。程序可以通过 malloc
、calloc
或 realloc
等函数在堆上动态分配内存。分配的内存需要手动释放(通过 free
)。
#include <stdio.h>
#include <stdlib.h>
int main() {
char *str = (char *)malloc(20 * sizeof(char)); // 动态分配堆内存
if (str == NULL) {
printf("内存分配失败!\n");
return 1;
}
snprintf(str, 20, "Hello, Heap!"); // 填充字符串
printf("%s\n", str); // 输出堆上的字符串
free(str); // 释放堆内存
return 0;
}