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

举报
韩曙亮 发表于 2022/01/11 01:32:15 2022/01/11
【摘要】 文章目录 前言一、正常程序二、获取相同的字符串内容 前言 C / 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;
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

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

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

  
 
  • 1
  • 2

在这里插入图片描述





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



如果在 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;
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

执行结果 :

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

  
 
  • 1
  • 2

在这里插入图片描述

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/121443520

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。