栈区和堆区以及注意事项

news2024/11/13 8:52:21

>>栈区

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int* func() {
	int a = 10;//栈上创建的变量
	return &a;
}

void test01() {
	int* p = func();
	//结果早已不重要,因为上面的a早已被释放,再去操作这块内存属于
	//非法操作
	printf("%d\n", *p);//10
	printf("%d\n", *p);//1907599
}

//栈区
char* getString() {
	char str[] = "hello world";
	return str;
}

void test02() {
	char* p = NULL;
	p = getString();
	printf("p = %s\n", p);//p = 烫烫烫烫烫烫h鱏
}

int main() {
	
	test01();
	test02();

	return 0;
}

 

>>栈区注意事项:
不要返回局部变量的地址,局部变量在函数体执行完毕过后会被释放,再次操作就是非法操作,结果未知!“ 

 >>堆区

  1. 利用malloc讲数据创建到堆区
  2. 利用free将堆区数据释放
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//堆区
//利用malloc讲数据创建到堆区
//利用free将堆区数据释放
int* getSpace() {
	int* p = malloc(sizeof(int) * 5);
	if (p == NULL) {
		return NULL;
	}
	for (int i = 0; i < 5; i++)
	{
		p[i] = 100 + i;
	}
	return p;
}

void test01() {
	int* p = getSpace();
	for (int i = 0; i < 5; i++) {
		printf("%d\n", p[i]);
	}

	//释放堆区数据
	free(p);
	p = NULL;//防止p是一个野指针
}

int main() {
	test01();
	system("pause");
	return EXIT_SUCCESS;
}

2、请问程序以下的输出结果是什么呢?

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

//堆区注意事项
void allocateSpace(char* pp) {
	char* temp = malloc(100);
	memset(temp, 0, 100);
	strcpy(temp, "hello world");
	pp = temp;
}

void test02() {
	char* p = NULL;
	allocateSpace(p);

	printf("%s\n", p);
}

int main() {
	test02();
	system("pause");
	return EXIT_SUCCESS;
}

 3、正确的输出hello world

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void allocateSpace(char** pp) {
	char* temp = malloc(100);
	memset(temp, 0, 100);
	strcpy(temp, "hello world");
	*pp = temp;
}

void test03() {
	char* p = NULL;
	allocateSpace(&p);

	printf("p2 = %s\n", p);
}

int main() {
	test03();
	system("pause");
	return EXIT_SUCCESS;
}

 

  • 利用 malloc 将数据创建到堆区
  • 利用 free 将堆区数据释放~

>>堆区注意事项:

  1. 如果给主调函数中 一个空指针分配内存,利用同级的指针是分配失败的
  2. 解决方式:利用高级指针修饰低级指针

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/729819.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

行业追踪,2023-07-04,受特斯拉中报影响,汽车零部件放量强势拉升,不调整

自动复盘 2023-07-04 成交额超过 100 亿 排名靠前&#xff0c;macd柱由绿转红 成交量要大于均线 有必要给每个行业加一个上级的归类&#xff0c;这样更能体现主流方向 rps 有时候比较滞后&#xff0c;但不少是欲杨先抑&#xff0c; 应该持续跟踪&#xff0c;等 macd 反转时参与…

Gitbash常用指令总结

Part I git 开始的指令 1、git init&#xff1a;初始化一个Git仓库&#xff1b; 2、git clone&#xff1a;从远程仓库克隆代码到本地&#xff1b; 直接使用网址 git clone <url>or 用a代替网址 git remote add a <url>git clone a3、git add&#xff1a;添加文件到…

计算机基础--->数据结构(8)【B树、B+树<超详细图文>】

文章目录 B树(B-Tree)B树的查询操作B树的几种插入删除情况 B树B树的主要特点插入操作删除操作 B树(B-Tree) B树&#xff08;B-Tree&#xff09;是一种自平衡的搜索树&#xff0c;又称平衡多路查找树&#xff0c;主要用于系统中大量数据的读和写操作。B树的特点是能保持数据有序…

English-英语语法体系

语法体系 英语中的所有语句类型&#xff1a;什么怎么样 英语语法最重要的就是动词&#xff01;

3.4.流的学习,异步任务的管理

目录 前言1. 流总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习精简 CUDA 教程-流的学习&#xff0c;异步任务的管理 课程大…

MySQL库表操作作业

创建数据库 mysql> create database Market; mysql> use Market; 创建表和约束 mysql> create table customers(c_num int(11) primary key not null UNIQUE Key auto_increment , -> c_name varchar(50), -> c_city varchar(50), -> c_birth datetime…

九、HTML中的定位

1、定位 position static 默认值 没有使用定位 relactive 相对定位 absolute 绝对定位 fixed 锚定 标准文档流 标准文档流 从上到下&#xff0c;从左向右&#xff0c;依次显示网页中的每一个元素 元素分类 行内元素 依次一个挨着一个显示 块级元素 独占一行 static 定位 以…

【STM32智能车】智能寻迹

【STM32智能车】智能寻迹 基础算法寻迹小车 我们之前说了到了寻迹这里会涉及到一些算法&#xff0c;不过各位小伙伴可以放心&#xff0c;我们这里用的是一些基础算法。不需要公式&#xff0c;只需要进行简单的判断就行。 基础算法 寻迹车的程序算法如下&#xff1a; 初始化&…

MySQL数据库小练习1

1.创建数据库&#xff0c;删除数据库&#xff0c;查询创建数据的语句&#xff0c;使用数据库&#xff0c;查询当前默认的数据库以及使用的编码方式校验规则 创建数据库及使用数据库&#xff1a; create database hzc default character set utf8mb4 collate utf8mb4_0900_ai_…

uniapp电子签名以及竖屏签名后内容旋转90度变为横屏图片

用该插件挺不错的 电子签名插件地址 如果你一个页面要用多个该插件&#xff0c;就改成不同的cavas-id&#xff0c;修改插件源码 效果图 竖屏写 旋转成横屏图片 插件内 在拿到签名临时地址后的页面 <!-- 旋转图片canvas --> <canvas canvas-id"camCacnvs&quo…

第二次CCF计算机软件能力认证

第一题&#xff1a;相邻数对 给定 n 个不同的整数&#xff0c;问这些数中有多少对整数&#xff0c;它们的值正好相差 1。 输出格式 输入的第一行包含一个整数 n&#xff0c;表示给定整数的个数。 第二行包含所给定的 n 个整数。 输出格式 输出一个整数&#xff0c;表示值正好相…

华为OD计算工时python脚本

前言 刚入职不知道工时要平均每天满8小时&#xff0c;并且看不到每天的实际工时&#xff0c;一气之下花了一个中午写了个脚本计算每天的工时&#xff0c;分享一下&#xff0c;不同地区的兄弟需要修改一下午休和晚饭时间才能使用。 文件位置 把welink上 上下班时间输入work.c…

支持向量机推导之r||w||=1的限制转化

支持向量机推导之r||w||1的限制转化 很多同学肯定是学过支持向量机的&#xff0c;也可能大致的理解了支持向量机这个算法&#xff0c;我想大部分人在学习这个算法的时候&#xff0c;对于推导过程有一步应该是不太理解。 我先简要介绍一下SVM,SVM的核心思想在于找到一个多维空间…

getCurrentInstance

https://blog.csdn.net/m0_46318298/article/details/130726043 注&#xff1a;$是在vue中所有实例中都可用的一个简单约定&#xff0c;这样做会避免和已被定义的数据&#xff0c;方法&#xff0c;计算属性产生冲突。

Leetcode-每日一题【203.移除链表元素】

题目 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6输出&#xff1a;[1,2,3,4,5] 示例 2&#xff1a; 输入&#…

nginx白名单配置

在有得项目中&#xff0c;我们会希望端口只有特定的用户可以访问&#xff0c;这时候就需要配置nginx的白名单&#xff0c;接来下展示一下白名单的配置和应用 vi /etc/nginx/nginx.conf server {listen 80;listen [::]:80;server_name _;root /usr/share/…

springboot第29集:springboot项目详细

public static LoginUser getLoginUser()&#xff1a;该行声明了一个公共的静态方法 getLoginUser()&#xff0c;它的返回类型是 LoginUser。try&#xff1a;开始一个 try 块&#xff0c;用于处理接下来的代码中可能发生的异常。return (LoginUser) getAuthentication().getPri…

STL好难(6):queue队列的使用

目录 1.queue的介绍 2.queue的使用&#xff1a; 3.queue的模拟实现&#xff1a; 4.deque的介绍&#xff1a; 5.deque的函数接口和底层原理&#xff1a; 6.deque的优缺点&#xff1a; 1.queue的介绍 queue的文档内容 1. 队列是一种容器适配器&#xff0c;专门用于在FIFO上…

二次-InsCode Stable Diffusion 美图活动一期

模型&#xff1a; AbyssOrangeMix2 - SFW_Soft NSFW_AbyssOrangeMix2_sfw.safetensors 参数配置&#xff1a; 正&#xff1a;Mountains and seas, people 负&#xff1a;NSFW, (worst quality:2), (low quality:2), (normal quality:2), lowres, normal quality, ((monochr…

C# .NET 如何调用 SAP RFC 接口

1.分析传参结构 SAP 传参格式对应 .NET 参数格式 SAP 参数.NET 参数参数类型import(导入)——关联类型为数据元素Param单个变量参数import(导出)——关联类型为结构体Struct结构体tableTable表 下面是 SAP 对应参数类型&#xff1a; 2.web.config 配置 配置文件需要客户端…