C语言 字符串字面量(String Literals)

字符串字面量是在编程语言中直接使用的字符串常量。它们通常由一对引号括起来的一系列字符组成。在不同的编程语言中,字符串字面量的表示方式和规则可能有所不同。在 C 和 C++ 中,字符串字面量(String Literals)是由一组字符组成的常量字符串,在程序中有一个特殊的存储位置和行为。

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、字符串字面量存储与栈、堆的区别

局部变量会存储在栈中,而字符串字面量不会。栈内存是由编译器自动分配和释放的临时内存区域。可以使用 mallocnew 在堆上动态分配内存,这与字符串字面量的存储位置无关。

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)堆存储

堆是用于动态内存分配的区域。程序可以通过 malloccallocrealloc 等函数在堆上动态分配内存。分配的内存需要手动释放(通过 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;
}

推荐阅读
cjavapy编程之路首页