C 语言内存四区原理 ( 常量区示例 | 不同函数返回的相同字符串的指针地址相同 )

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C 语言内存四区原理 ( 常量区示例 | 不同函数返回的相同字符串的指针地址相同 )相关的知识,希望对你有一定的参考价值。

前言

C / C++ 编译器会对代码进行 词法分析 , 语法分析 , 句法分析 ;

然后对代码进行优化 ;

将 字符串常量 赋值给指针时 , 首先去 全局变量区常量区 查询该 字符串常量是否存在 ,

  • 如果存在 , 直接使用该 字符串常量地址 赋值给 char* 指针 ,
  • 如果不存在 , 直接在常量区 创建一个新的字符串 , 然后将地址 赋值给 char* 指针 ;

下面的 2 2 2 个程序 , 分别演示 不同的字符串常量 和 相同的字符串常量 地址的区别 ;





一、正常程序



分别从两个函数中 , 获取两个不同的字符串 , 打印出这两个 字符串 内容指针指向的地址 ;


代码示例 :

#include <stdio.h>

/*
 * 函数1 返回字符串 1
 */
char *get_str1()

    char *p1 = "abc";
    return p1;


/*
 * 函数2 返回字符串 2
 */
char *get_str2()

    char *p2 = "123";
    return p2;


int main()

    char *p1 = NULL;
    char *p2 = NULL;

    // 分别从 2 个函数中获取 2 个字符串
    p1 = get_str1();
    p2 = get_str2();

    // 打印 p1 , p2 指针指向的内存中的字符串数据
    // p1=abc, p2=123
    printf("p1=%s, p2=%s\\n", p1, p2);

    // 打印 p1 , p2 指针指向的地址
    // p1=4210756, p2=4210760
    printf("p1=%d, p2=%d\\n", p1, p2);

    return 0;


执行结果 : 打印出的字符串内容不同 , 字符串指针地址不同 ;

p1=abc, p2=123
p1=4210756, p2=4210760





二、获取相同的字符串内容



如果在 2 2 2 个函数中 , 获取的 字符串 是相同的字符串 ;

此时打印出两个函数的指针地址是相同的 , 这是因为 获取的 字符串 都是从 全局区 中的 常量区 中获取的 ;


代码示例 :

#include <stdio.h>

/*
 * 函数1 返回字符串 1
 */
char *get_str1()

    char *p1 = "abc";
    return p1;


/*
 * 函数2 返回字符串 2
 */
char *get_str2()

    char *p2 = "abc";
    return p2;


int main()

    char *p1 = NULL;
    char *p2 = NULL;

    // 分别从 2 个函数中获取 2 个字符串
    p1 = get_str1();
    p2 = get_str2();

    // 打印 p1 , p2 指针指向的内存中的字符串数据
    // p1=abc, p2=123
    printf("p1=%s, p2=%s\\n", p1, p2);

    // 打印 p1 , p2 指针指向的地址
    // p1=4210756, p2=4210760
    printf("p1=%d, p2=%d\\n", p1, p2);

    return 0;


执行结果 :

p1=abc, p2=abc
p1=4210756, p2=4210756

以上是关于C 语言内存四区原理 ( 常量区示例 | 不同函数返回的相同字符串的指针地址相同 )的主要内容,如果未能解决你的问题,请参考以下文章

C 语言内存四区原理 ( 内存四区建立流程 )

C语言:内存四区

C语言之内存四区

C 语言内存四区原理 ( 栈内存与堆内存对比示例 | 函数返回的堆内存指针 | 函数返回的栈内存指针 )

码海拾遗:内存四区

内存四区-常量区