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; }