当前位置: 首页 > news >正文

c语言练习84:动态内存管理

动态内存管理

例题:

错误代码:

#include<stdio.h>
#include<stdlib.h>
void GetMemory(char* p) {p = (char*)malloc(100);
}
void Test(void) {char* str = NULL;GetMemory(str);strcpy(str, "hello world");printf(str);
}
int main() {Test();return 0;
}

正确代码:

#include<stdio.h>
#include<stdlib.h>
void GetMemory(char** p) {*p = (char*)malloc(100);
}
void Test(void) {char* str = NULL;GetMemory(&str);strcpy(str, "hello world");printf(str);
}
int main() {Test();return 0;
}

因为使用了malloc所以需要free。

错误案例:

错误代码:

#include<stdio.h>
#include<stdlib.h>
char* GetMemory(void) {char p[] = "hello world";return p;
}
void Test(void) {char* str = NULL;str=GetMemory();printf(str);
}
int main() {Test();return 0;
}

原因分析(返回栈空间地址的问题):

str会变为野指针

 出了函数之后局部变量就会销毁(p)对应的空间会还给操作系统,其对应空间的内容1可能被修改(被其他内容覆盖掉),printf打印的时候会形成非法访问。

错误案例:

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

 原因分析:

free(str)后str成为了野指针,printf(str)时会形成非法访问。

ptr未初始化(即为野指针)对也指针解应用会形成非法访问内存。

的打印原理:

#include<stdio.h>
int main() {printf("hello\n");char* p = "hello";printf(p);return 0;
}

http://www.lryc.cn/news/187241.html

相关文章:

  • [Go版]设计模式——Template模版方法模式
  • 数据结构 | (四) Queue
  • 让照片人物开口说话,SadTalker 安装及使用(避坑指南)
  • 系统架构设计:6 论软件质量保证及其应用
  • vscode的窗口下拉显示行数不够
  • Linux UWB Stack实现——MCPS调度接口(数据结构)
  • 2023Q3数据安全政策、法规、标准及报告汇总(附下载)
  • Ceph入门到精通-iptables 限制多个ip 的多个端口段访问
  • 【C/C++】STL——深度剖析vector容器
  • 如何在idea中隐藏文件或文件夹
  • Scala第二十章节
  • redis的持久化消息队列
  • 分类预测 | MATLAB实现KOA-CNN开普勒算法优化卷积神经网络数据分类预测
  • 用 Pytorch 自己构建一个Transformer
  • Docker安装ActiveMQ
  • 【二】spring boot-设计思想
  • 系统架构设计:7 论企业集成架构设计及应用
  • 【pytorch】多GPU同时训练模型
  • Git 学习笔记 | Git 基本理论
  • 滚动表格封装
  • 【LeetCode高频SQL50题-基础版】打卡第3天:第16~20题
  • 系统压力测试:保障系统性能与稳定的重要措施
  • 常用数据结构和算法
  • C++中使用引用避免内存复制
  • 计算机网络(第8版)-第4章 网络层
  • chromadb 0.4.0 后的改动
  • Windows环境下下载安装Elasticsearch和Kibana
  • 机器学习:随机森林
  • ctfshow-web11(session绕过)
  • 状态模式:对象状态的变化