动态内存管理(下 )

目录

书接上文,动态内存管理,

题目4

[1. 柔性数组](#1. 柔性数组)

2.总结C/C++中程序内存区域划分

C/C++程序内存分配的⼏个区域:


书接上文,动态内存管理,

题目4

大家来思考一下

复制代码
void Test(void)
 {
 char *str = (char *) malloc(100);
 strcpy(str, "hello");
 free(str);
 if(str != NULL)
 {
 strcpy(str, "world");
 printf(str);
 }
 }

你掌握了吗?

复制代码
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
void Test(void)
{
	char* str = (char*)malloc(100);
	strcpy(str, "hello");//这里的str拷贝了一份hello 的地址,
	free(str);//str被释放后成为野指针
	if (str != NULL) // ok
	{
		strcpy(str, "world");// 把str还给操作系统了无法继续使用打印出来hello和world越界访问 
		printf(str);
	}
}
int  main()
{

	Test();
	return 0;
}

正确的应该在free后面加上str为NULL 就不会出现越界访问的问题

复制代码
void Test(void)
{
	char* str = (char*)malloc(100);
	strcpy(str, "hello");//这里的str拷贝了一份hello 的地址,
	free(str);//提前释放这块空间不属于str了
	str = NULL;
	if (str != NULL) // ok
	{
		strcpy(str, "world");// 打印出来hello和world越界访问 ,
		printf(str);
	}
}

1. 柔性数组

也许你从来没有听说过柔性数组(flexible array)这个概念,但是它确实是存在的。 C99 中,结构中的最后⼀个元素允许是未知⼤⼩的数组,这就叫做『柔性数组』成员

struct arr

{

int a;

char c;

int b\[\];//没有定义大小的成员叫柔性数组成员,只限定于最后一个

};

用malloc 实现柔性数组

复制代码
struct arr
{
	int a;
	char c;
	int arr[];//没有定义大小的成员叫柔性数组成员
};
int main()
{
	 struct arr* S= (struct arr *) malloc(sizeof(struct arr) + 20 * sizeof(int));
	 if (S == NULL)
	 {
		 perror("malloc()");
		 return 1;
	 }
	 //使用空间
	 S->a = 100;
	 int i = 0;
	 for(i = 0; i < 20; i++)
	 {
		 S->arr[i] = i + 1;
	 }
	 //调整空间大小
	 struct arr*ptr =(struct arr *)  realloc(S, sizeof(struct arr) + 40 * sizeof(int));
	 if (ptr != NULL)
	 {
		 S = ptr;
		 ptr = NULL;
	 }
	 else
	 {
		 return 0;
	 }
	 for (i = 0; i < 40; i++)
	 {
		 printf("%d ", S->arr[i]);
	 }
	 free(S);
	 S = NULL;
	return 0;

前20个数字打印后,后20个字节打印随机值。

好处是:⽅便内存释放

拓展阅读

C语⾔结构体⾥的数组和指针

2.总结C/C++中程序内存区域划分

前面的内存函数中讲到 存在内存的分配空间,当然内存不只有 栈区、堆区、静态区、上面的就只是在语言的内存大概的剖析,当然到了Linux 系统中就不一样了。

C/C++程序内存分配的⼏个区域:

1. 栈区(stack):在执⾏函数时,函数内局部变量的存储单元都可以在栈上创建,函数执⾏结束时 这些存储单元⾃动被释放。栈内存分配运算内置于处理器的指令集中,效率很⾼,但是分配的内 存容量有限。 栈区主要存放运⾏函数⽽分配的局部变量、函数参数、返回数据、返回地址等。 《函数栈帧的创建和销毁》

2. 堆区(heap):⼀般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。分配 式类似于链表。

3. 数据段(静态区):(static)存放全局变量、静态数据。程序结束后由系统释放。

**4. 代码段:**存放函数体(类成员函数和全局函数)的⼆进制代码。

相关推荐
wljy17 小时前
二、进制状态转换
linux·运维·服务器·c语言·c++
01_ice8 小时前
C语言数据在内存中的存储
c语言·开发语言
bucenggaibian8 小时前
《C语言》编程前置:计算机底层逻辑(诞生的基础)
c语言·程序框架·编译运行·内存地址·底层逻辑
智者知已应修善业9 小时前
【51单片机8位数码管动态显示日期小数点风格】2023-11-13
c++·经验分享·笔记·算法·51单片机
智者知已应修善业9 小时前
【51单片机有三个LED 分别第一个灯闪三下 再到第二个灯又闪三下 再到第三个灯又闪三下 就这样循环程序】2023-11-16
c++·经验分享·笔记·算法·51单片机
暴躁小师兄数据学院9 小时前
【AI大数据工程师特训笔记】第04讲:PostgreSQL 数据库内置函数详解
大数据·数据库·笔记·ai·语言模型
小娄~~10 小时前
C语言卷子错题集
c语言·开发语言·数据结构
z落落11 小时前
C# 数组 最终完整版全套笔记(一维+多维+交错+引用类型+对象数组)
java·笔记·c#
searchforAI12 小时前
B站视频转笔记用哪个工具?2026年四款AI笔记工具对比实测
人工智能·经验分享·笔记·gpt·学习·视频总结·ai笔记
RainCity13 小时前
Java Swing 自定义组件库分享(九)
java·笔记·后端