首页 > 其他分享 >函数内部返回指向字符串的指针和数组名的区别

函数内部返回指向字符串的指针和数组名的区别

时间:2024-06-20 17:46:26浏览次数:13  
标签:只读 char 数组名 内存 str 字符串 World Hello 指针

目录

两道题目

先来看两道与内存管理有关的题目

  1. 以下程序会出错吗?如果不会则输出什么?
#include <stdio.h>

char* func() {
	char* str = "Hello World";
	return str;
}
int main() {
	char* str = func();
	// 程序输出Hello World
	printf("%s\n", str);

	return 0;
}
  1. 以下程序会出错吗?如果不会则输出什么?
#include <stdio.h>

char* func() {
	char str[] = "Hello World";
	return str;
}
int main() {
	char* str = func();
	// 运行将会出现段错误
	printf("%s\n", str);

	return 0;
}

进程的内存分布

  1. 从高地址到低地址,一个进程由内核空间,命令行参数和环境变量、栈、文件映射区、堆、BSS段、数据段、代码段等组成。
    1. 命令行参数和环境变量:命令行参数即为以命令行启动程序运行时传递的参数
    2. 栈:存储函数参数值及局部变量
    3. 文件映射区
    4. 堆区:动态申请内存使用
    5. BSS段:存放未初始化的全局变量以及静态变量
    6. 数据段:存放已初始化的全局变量以及静态变量
    7. 代码段:存放只读的常量以及可执行的代码
    8. 只读数据段:存放只读变量(比如说const关键字修饰的变量)和字符串常量。

结论

  1. 函数内部返回指向字符串的指针时,其值为位于只读数据段的字符串常量地址。只读数据段和栈/堆数据段/代码段/bss段/代码段一样分布于Linux进程地址空间中
  2. 函数内返回数组名时,由于是数组,会使用栈空间为数组开辟内存,数组中的内容是只读数据段上的字符串的拷贝。数组名指向栈内存,当函数调用结束,函数外使用这块已经回收的内存,就会出现段错误。
  3. 测试如下:
void func() {
	char aaa[] = "Hello World";
	char* sss = "Hello World";
	char* www = "Hello World";
	// 0x7ffe427c1f7c,0x5575a85ce004,0x5575a85ce004
	cout << (void*)aaa << "," << (void*)sss <<  "," << (void*)www << endl;
	
}

标签:只读,char,数组名,内存,str,字符串,World,Hello,指针
From: https://www.cnblogs.com/xiaocer/p/18259125

相关文章

  • DEMO_02:随机数获取;数组集合遍历;整型与字符串转换;字符串字符遍历;数组/集合排序
    /***考核点:随机数获取;数组集合遍历;整型与字符串转换;字符串字符遍历;数组/集合排序*<p>*题目:*1.使用while循环获取20个五位数随机数并打印;*2.遍历20个数,筛选出随机数中3的倍数,并统计个数;*3.符合2的数中,找出五位数中3的倍数和位置*4.符合2的数中,把这五位数......
  • 每日一道算法题 删除字符串中出现次数最少的字符
    题目删除字符串中出现次数最少的字符_牛客题霸_牛客网(nowcoder.com)C语言#include<stdio.h>#include<string.h>voidfun_2024_6_17(void){charstr[20]={0};while(scanf("%s",str)!=EOF){intalpha[26]={0};intmin=20;......
  • 0基础学C++ | 第02天 | 基础知识 | sizeof关键字 | 浮点型 | 字符型 | 转义字符 | 字
    前言  该文章是在B站学习C++,同时结合自己的理解整理的笔记,视频连接:https://www.bilibili.com/video/BV1et411b73Z/?p=8&spm_id_from=333.880.my_history.page.click 1、sizeof关键字作用:利用sizeof关键字可以统计数据类型所占用的内存大小语法:sizeof(数据类型/变量)#incl......
  • 深入理解指针(1)
    目录:1.内存和地址2.指针变量和地址3.指针变量类型的意义4.const修饰指针5.指针运算6.野指针7.assert断⾔8.指针的使⽤和传址调用1.内存和地址1.1内存在讲内存和地址之前,我们想有个⽣活中的案例:假设有⼀栋宿舍楼,把你放在楼⾥,楼上有100个房间,但是房间没......
  • DEMO_01:List数据存储,回调函数,集合转字符串,元素去重
    *题目:*1.构建属性结构List<DemoNode>data,根据本包的data.png中数据结构图将数据存入data中(字就是nodeName)*2.将树形结构List<DemoNode>里面的元素全部遍历出来存放到List<String>list中,输出结果转换成字符串:粉粉碎机被粉碎机粉碎了怎么办*3.将list里元素去重后......
  • linux - 字符串替换
    使用场景:部署项目的时候,需要统一修改IP地址等内容。缺点:这些命令,都缺少必要的校验功能,容易因为操作失误,会出现未替换,或者替换成空串的情况。比如说:写了好多行的sed命令,不小心删了一行代码,这种情况下,执行代码不会报错,因此很容易埋下安全隐患。推荐:要进行很复杂的替换时,还是......
  • #C:比如有如下两个字符串:“hello“、“helhehe“不能使用库函数完成字符串的比较
    #include<stdio.h>#include<string.h>voidtest00()//比如有如下两个字符串:"hello"、"helhehe"不能使用库函数完成字符串的比较{ //时刻需要注意变量i的值  charbuf1[128]="";   printf("请输入第一个字符串buf1:");   //scanf("%s",buf1);......
  • #c:键盘输入一个字符串判断它是不是回文 回文:123321
    小小案例仅供参考:/键盘输入一个字符串判断它是不是回文比如:12321这个就是回文#include<stdio.h>#include<string.h>voidtest01(){  charbuf[128]="";  printf("请输入一个字符串:\n");  fgets(buf,sizeof(buf),stdin);  buf[strlen(buf)-1]=0; ......
  • C语言程序设计-10 指针
    指针是C语言中广泛使用的一种数据类型。运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构;能很方便地使用数组和字符串;并能象汇编语言一样处理内存地址,从而编出精练而高效的程序。指针极大地丰富了C语言的功能。学习指针是学习C语言中最重要的一环,能......
  • Leetcode Hot100之双指针
    1.移动零题目描述给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。请注意,必须在不复制数组的情况下原地对数组进行操作。解题思路双指针遍历一遍即可解决:我们定义了两个指针i和j,它们都初始化为0。然后,我们开始遍历列表......