1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 【C 语言】内存四区原理 ( 常量区示例 | 不同函数返回的相同字符串的指针地址相同 )

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

时间:2022-10-06 11:50:13

相关推荐

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

文章目录

前言一、正常程序二、获取相同的字符串内容

前言

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

然后对代码进行优化 ;

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

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

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

一、正常程序

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

代码示例 :

#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=123printf("p1=%s, p2=%s\n", p1, p2);// 打印 p1 , p2 指针指向的地址// p1=4210756, p2=4210760printf("p1=%d, p2=%d\n", p1, p2);return 0;}

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

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

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

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

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

代码示例 :

#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=123printf("p1=%s, p2=%s\n", p1, p2);// 打印 p1 , p2 指针指向的地址// p1=4210756, p2=4210760printf("p1=%d, p2=%d\n", p1, p2);return 0;}

执行结果 :

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。