C/C++ 错误笔记-如果要释放内存,必须拿到内存的首地址进行释放

例:修改字符串的第三个字母为a

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

#pragma warning(disable:4996)

void main() {

    char *p = (char *)malloc(100);
    strcpy(p,"123456789");

    p = p + 2;
    *p = ‘a‘;
    free(p);

    system("pause");

}

运行,VS报下列错误:

出现这个问题的原因是,C语言规定:如果要释放内存,必须拿到内存的首地址进行释放

而p指针在释放之前,进行了移位操作,不再指向首地址,因此程序发生crash。解决办法:只需要保存首元素的地址用来释放即可。

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

#pragma warning(disable:4996)

void main() {

    char *p = (char *)malloc(100);
    strcpy(p,"123456789");
    char *pHeader = p;

    p = p + 2;
    *p = ‘a‘;
    printf("%s\n", pHeader);
    free(pHeader);

    system("pause");

}

运行结果:

时间: 2024-11-05 13:28:14

C/C++ 错误笔记-如果要释放内存,必须拿到内存的首地址进行释放的相关文章

内存管理概述、内存分配与释放、地址映射机制(mm_struct, vm_area_struct)、malloc/free 的实现

http://blog.csdn.net/pi9nc/article/details/23334659 注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料如<linux内核完全剖析>.<linux c 编程一站式学习>等,只是为了更好地理清系统编程和网络编程中的一些概念性问题,并没有深入地阅读分析源码,我也是草草翻过这本书,请有兴趣的朋友自己参考相关资料.此书出版较早,分析的版本为2.4.16,故出现的一些概念可能跟最新版本内核不同.

Python笔记_第一篇_童子功_0.内存详解(含位运算)

Python的很多教材中并没有讲内存方面的知识,但是内存的知识非常重要,对于计算机工作原理和方便理解编程语言是非常重要的,尤其是小白,因此需要把这一方面加上,能够更加深入的理解编程语言.这里引用了C语言关于内容的详细讲解,其实很多知识都是相同的. 第一部分:程序(计算机运行)为什么需要内存? 对于内存的理解是对编程语言直接相关的,如果没有对内存有很深的认识的话,对于编程语言也就是没有根本的认识,编程语言跟内存有千丝万缕的联系. 1.1 计算机程序运行的目的 计算机为什么需要编程?编程已经编了那么

Android错误笔记

----------------Your project contains error(s),please fix them before running your application 解决 Your project contains error(s),please fix them before running your application问题 貌似好多人都有遇到这问题,而且网上也有各种各样的解决办法,但是,你是否用尽了也没能解决你的问题呢? 别急,我们先来看下各位前辈的解决办法: 1

C++ Primer 学习笔记_98_非一般工具与技术 -优化内存分配

特殊工具与技术 --优化内存分配 引言: C++的内存分配是一种类型化操作:new为特定类型分配内存,并在新分配的内存中构造该类型的一个对象.new表达式自动运行合适的构造函数来初始化每个动态分配的类类型对象. new基于每个对象分配内存的事实可能会对某些类强加不可接受的运行时开销,这样的类可能需要使用用户级的类类型对象分配能够更快一些.这样的类使用的通用策略是,预先分配用于创建新对象的内存,需要时在预先分配的内存中构造每个新对象. 另外一些类希望按最小尺寸为自己的数据成员分配需要的内存.例如,

C++ Primer 学习笔记_98_特殊的工具和技术 --优化内存分配

特殊的工具和技术 --优化内存分配 引言: C++的内存分配是一种类型化操作:new为特定类型分配内存,并在新分配的内存中构造该类型的一个对象.new表达式自己主动执行合适的构造函数来初始化每一个动态分配的类类型对象. new基于每一个对象分配内存的事实可能会对某些类强加不可接受的执行时开销,这种类可能须要使用用户级的类类型对象分配能够更快一些. 这种类使用的通用策略是,预先分配用于创建新对象的内存,须要时在预先分配的内存中构造每一个新对象. 另外一些类希望按最小尺寸为自己的数据成员分配须要的内

operator is not a known binary operator swift 语法错误笔记

operator is not a known binary operator swift 语法错误笔记 error: operator is not a known binary operator for x in 1..10 版本更新,开区间  改为 "..<" var arr = String[]() array types are now written with the brackets around the element type 版本更新,改为var arr:[S

django错误笔记(xadmin)——AttributeError: &#39;Settings&#39; object has no attribute &#39;TEMPLATE_CONTEXT_PROCESSORS&#39;

使用Xadmin,执行makemigrations和migrate时运行报错提示: AttributeError: 'Settings' object has no attribute 'TEMPLATE_CONTEXT_PROCESSORS' 方法一: setting.py文件添加以下信息: TEMPLATE_CONTEXT_PROCESSORS = ( 'django.contrib.auth.context_processors.auth', 'django.core.context_pr

内存泄露 Memory Leaks 内存优化【总结】

什么是内存泄露 内存管理一直是Java 所鼓吹的强大优点.开发者只需要简单地创建对象,而Java的垃圾收集器将会自动管理内存空间的分配和释放. 但在很多情况下,事情并不那么简单,在 Java程序中总是会频繁地发生内存泄露(Memory Leaks). 内存泄漏就是:当某些对象不再被应用程序所使用,但是由于仍然被引用而导致垃圾收集器不能释放他们. 或者说是:我们对某一内存空间使用完成后没有释放. 用白话来说就是:该回收的内存没被回收. 要理解这个定义,我们需要理解内存中的对象状态.下图展示了什么是

linux内核探索之内存管理(二):linux系统中的内存组织--结点、内存域和页帧

本文主要参考<深入linux内核架构>(3.2节)及Linux3.18.3内核源码 概述:本文主要描述了内存管理相关的数据结构:结点pg_data_t.内存域struct zone以及页帧(物理页):struct page ,以及该结构相关的一些基本概念. 1. 概述 内存划分为接点,每个结点关联到系统中的一个处理器,在内核中表示为pg_data_t. 各个结点又划分为内存域,比如DMA内存域,高端内存域,普通内存域. 内核内存域的宏: enum zone_type { #ifdef CONF