内存地址越界访问异常

  在做循环链表习题的时候,当我进行结点删除操作时,发生如下异常:

  调试后发现,异常发生在free()在释放空间时,如果把free注释,异常将不会发生

最初的代码是这样的:

typedef struct LNode{
DataType data;
LNode *next;
}LNode,*LinkList;
int InterList(LinkList &head){

int count,i;
LinkList p,q;
head=(LinkList)malloc(sizeof(LinkList));    // 这里取了LinkList大小
p=head;
printf("请输入总人数:");
scanf("%d",&count);
p->data=1;
p->next=p;
for(i=2;i<=count;i++){

q=(LinkList)malloc(sizeof(LinkList));
q->data=i;
q->next=head;
p->next=q;
p=p->next;
}
head=p; 
return count;

}
void GameList(LinkList &head,int count){
LinkList p,q;
q=(LinkList)malloc(sizeof(LinkList));
p=head;
printf("%d",p->next->data);
q=p->next;
p->next=p->next->next;
free(q);
for(int i=1;i<count;i++){
p=p->next->next;
q=p->next;
printf("%d",q->data);
q=(LinkList)malloc(sizeof(LinkList));
p->next=p->next->next;
free(q);
}
}

  因为LinkList 是指针类型,sizeof(LinkList) 统计指针占用内存空间,也就是地址线位数,一般为32位占用4个字节,而我的这个结构体实际占用应该是8个字节,因此产生异常,但编译器不会报告错误,如果我不free释放内存,程序也能正常执行直到结束

  但是如果调用了free,他实际需要释放的内存就大于所分配的内存,可能会破坏其他内存数据,因此程序执行到此出现异常

  解决方法:按结构体大小进行分配

  head=(LinkList)malloc(sizeof(LNode));

时间: 2024-10-25 21:08:18

内存地址越界访问异常的相关文章

11.用C对32位内存地址的访问方式

使用一个32位处理器,要对一个32位的内存地址进行访问,可以这样定义 #define RAM_ADDR     (*(volatile unsigned long *)0x0000555F)     然后就可以用C语言对这个内存地址进行读写操作了     读:tmp = RAM_ADDR:     写:RAM_ADDR = 0x55: 定义volatile是因为它的值可能会改变,大家都知道为什么改变了: 如果在一个循环操作中需要不停地判断一个内存数据,例如要等待RAM_ADDR的I标志位置位,因

内存映射与访问机制

通过参考内存布局及访问机制的相关文章,本文试着整合一下相关知识点,希望能对有需要的朋友提供一点参考.但由于所参考文章皆为网友所作,相关知识并没有形成系统的认识,所以有些知识点仍然不够清楚,也难免有谬误之处.如果大家发现错误,敬请指出,另外倘若有关于“系统启动及内存布局”方面的可靠的资料或书籍,恳请大神留言告知. 参考文章(只列出几个重要的):http://www.cnblogs.com/clover-toeic/p/3754433.html http://blog.chinaunix.net/u

【内存管理】缺页异常

本节介绍缺页异常相关的知识: 页式管理机制通过页面目录,页面表,将每一个线性地址(虚拟地址)转换成物理地址,但并不是每一次CPU都能访问到相应的物理内存单元,因此这样映射便失败了,会产生缺页异常: 获得缺页异常的虚拟地址做对应的判断 dotraplinkage void __kprobes do_page_fault(struct pt_regs *regs, unsigned long error_code) { //error_code提示异常原因信息的出错代码 struct vm_area

Oracle字符乱码、数据越界访问典型Bug分析

前言: 作为乙方,在甲方客户那里验收阶段发现两个诡异Bug.以下就问题来源.问题根因.解决方案.如何避免做详细描述. 一.Bug1:Oracle读写字符乱码. 1.问题来源 Oracle数据库监听http://blog.csdn.net/laoyang360/article/details/46524519 需要获取最新插入的中文类别字符,以判定分类.单步调试发现每次接收到的都是乱码. 2.问题根因 编码格式不一致导致. 3.解决方案 第一步:查看oracle自身的编码格式,可以通过命令sele

C语言:内存地址分析 &amp; sizeof和strlen用法总结

还是在大学时代接触的C语言,当时学习数组.指针等概念时,怎一个"晕"字了得.最近在学习之余,疯狂地恶补了相关知识,故总结之,如有错误,请大家多多指点. 一. 内存地址分析 1) 先来看一个最基础的例子: int a[4]; 提问:&a[0],  a,  &a,  a+1,  &(a+1),  &a+1 分别表示什么? 咋一看,真的不知所措: 我们可以图解来分析它(假设下面的操作均在32为系统上面). 先来对上图进行简单的说明工作: 1. 紫色区域就是数组

C语言精要总结-内存地址对齐与struct大小判断篇

在笔试时,经常会遇到结构体大小的问题,实际就是在考内存地址对齐.在实际开发中,如果一个结构体会在内存中高频地分配创建,那么掌握内存地址对齐规则,通过简单地自定义对齐方式,或者调整结构体成员的顺序,可以有效地减少内存使用.另外,一些不用边界对齐.可以在任何地址(包括奇数地址)引用任何数据类型的的机器,不在本文讨论范围之内. 什么是地址对齐 计算机读取或者写入存储器地址时,一般以字(因系统而异,32位系统为4个字节)大小(N)的块来执行操作.数据对齐就是将数据存储区的首地址对齐字大小(N)的某个整数

对象内存布局与访问

对象内存布局 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header).实例数据(Instance Data)和对齐填充(Padding). 对象头 HotSpot虚拟机的对象头包括两部分信息:运行时数据和类型指针. 运行时数据 用于存储对象自身的运行时数据,如哈希码(HashCode).GC分代年龄.锁状态标志.线程持有的锁.偏向线程ID.偏向时间戳等. 类型指针 即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例. 如果对象是一个Ja

存储opline的内存地址可以实时跟踪opcode的执行

static intphp_handler(request_rec *r) { /* Initiliaze the context */ php_struct * volatile ctx; void *conf; apr_bucket_brigade * volatile brigade; apr_bucket *bucket; apr_status_t rv; request_rec * volatile parent_req = NULL; TSRMLS_FETCH(); ...... z

new的越界访问

今天敲代码的时候发现了一个BUG和大家分享一下,希望大家下次不要犯和我一样的错误. 如果犯了和我一样的错,也能知道自己错在哪里!   <(^-^)> 函数如下:(斐波那契数列的实现) long long FibonacciSeq( int n) { long long *fib=new long long[n+1]; fib[0] = 0; fib[1] = 1; for (int i = 2;i <=n; i++) { fib[i] = fib[i - 1] + fib[i - 2];