一个很有深度的C++内存问题---GDB调试(一)

先看代码(a.c):

#include <stdio.h>
int main(int argc, char* argv[])
{
int a[4]={1,2,3,4};
int *ptr1=(int*)(&a+1);
int *ptr2=(int*)((int)a+1);
int *ptr3=(int*)(a+1);
printf("a = %x, &a = %x, &a+1 = %x, (int)a+1 = %x\n", a, &a, &a+1, (int)a+1);
printf("ptr1 = %x, ptr2 = %x, ptr3 = %x, &ptr1[-1] = %x\n", ptr1, ptr2, ptr3, &ptr1[-1]);
printf("ptr1[-1] = %x, *ptr2 = %x, *ptr3 = %x\n",ptr1[-1],*ptr2, *ptr3);
return 0;
}


再看调试情况:

[zcm@t #81]$make clean
rm -f *.o a
[zcm@t #82]$make
gcc -g   -c -o a.o a.c
gcc -g -o a a.o
[zcm@t #83]$gdb a
GNU gdb (GDB) Fedora (7.0-3.fc12)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /mnt/hgfs/Linux_Share/t/a...done.
(gdb) list
1	#include <stdio.h>
2	
3	int main(int argc, char* argv[])
4	{
5		int a[4]={1,2,3,4};
6		int *ptr1=(int*)(&a+1);
7		int *ptr2=(int*)((int)a+1);
8		int *ptr3=(int*)(a+1);
9		printf("a = %x, &a = %x, &a+1 = %x, (int)a+1 = %x\n", a, &a, &a+1, (int)a+1);
10		printf("ptr1 = %x, ptr2 = %x, ptr3 = %x, &ptr1[-1] = %x\n", ptr1, ptr2, ptr3, &ptr1[-1]);
(gdb) list
11		printf("ptr1[-1] = %x, *ptr2 = %x, *ptr3 = %x\n",ptr1[-1],*ptr2, *ptr3);
12	
13		return 0;
14	}(gdb) b 5
Breakpoint 1 at 0x80483ce: file a.c, line 5.
(gdb) b 11
Breakpoint 2 at 0x8048472: file a.c, line 11.
(gdb) b 13
Breakpoint 3 at 0x80484a0: file a.c, line 13.
(gdb) run
Starting program: /mnt/hgfs/Linux_Share/t/a 
Breakpoint 1, main (argc=1, argv=0xbffff2f4) at a.c:5
5		int a[4]={1,2,3,4};
Missing separate debuginfos, use: debuginfo-install glibc-2.11-2.i686
(gdb) c
Continuing.
a = bffff214, &a = bffff214, &a+1 = bffff224, (int)a+1 = bffff215
ptr1 = bffff224, ptr2 = bffff215, ptr3 = bffff218, &ptr1[-1] = bffff220
Breakpoint 2, main (argc=1, argv=0xbffff2f4) at a.c:11
11		printf("ptr1[-1] = %x, *ptr2 = %x, *ptr3 = %x\n",ptr1[-1],*ptr2, *ptr3);
(gdb) c
Continuing.
ptr1[-1] = 4, *ptr2 = 2000000, *ptr3 = 2
Breakpoint 3, main (argc=1, argv=0xbffff2f4) at a.c:13
13		return 0;
(gdb) x /24xb a
0xbffff214:	0x01	0x00	0x00	0x00	0x02	0x00	0x00	0x00
0xbffff21c:	0x03	0x00	0x00	0x00	0x04	0x00	0x00	0x00
0xbffff224:	0x24	0xf2	0xff	0xbf	0x15	0xf2	0xff	0xbf
(gdb) 


最后看图解:

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

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

相关文章

咬文嚼字——1

看点&#xff1a;作者王琦 勘误&#xff1a;张琦等编著 出处&#xff1a;永正网上购书中心 [url]http://www.erbook.com.cn/list.asp?sp_code9787121067921[/url] 《案例精解企业级网络构建》六位主创人员博客地址&#xff1a; 张琦&#xff1a; [url]http://zhangqi.blog.51…

HTML DOM之属性的各种操作方法

1.element.getAttribute(attributename)方法用来返回指定属性名的属性值&#xff0c;返回的类型是字符串类型 2.element.getAttributeNode(attributename)方法从当前元素节点(nodeType值为1的节点)element中通过名称获取属性节点(nodeType值为2的节点)&#xff0c;返回值是指定…

CSS Grid布局(2)

6.间距 grid-column-gap和grid-row-gap属性用来创建列与列&#xff0c;行与行之间的间距 间距(Gap)可以设置任何非负值&#xff0c;长度值可以是px、%、em等单位值 grid-gap是grid-row-gap和grid-column-gap两个属性的缩写 如果它指定了两个值&#xff0c;那么第一个值是设置…

React开发(124):ant design学习指南之form中的属性isFieldTouched

没有值的时候返回提示的error 有值返回undefined

HDU 4990 Ordered Subsequence --数据结构优化DP

题意&#xff1a;给一串数字&#xff0c;问长度为m的严格上升子序列有多少个 解法&#xff1a;首先可以离散化为10000以内&#xff0c;再进行dp&#xff0c;令dp[i][j]为以第i个元素结尾的长度为j的上升子序列的个数&#xff0c; 则有dp[i][j] SUM(dp[k][j-1]) (a[k] < a[…

CSS Grid布局(3)

10.网格线命名 通过grid-template-rows和grid-template-columns定义网格时&#xff0c;网格线可以被命名。网格线名称也可以设置网格项目位置 grid-template-rows和grid-template-columns定义你的网格&#xff0c;将名称分配给网格线 定义网格线名称时需要避免使用规范中出现…

VS 2010 OpenGL 配置与实例开发

首先参考了网上的安装配置环境部分&#xff1a;http://blog.csdn.net/Ididcan/article/details/4490797 最近准备学习OpenGL,结果发现敲入书中给的代码&#xff0c;居然提示头文件找不到&#xff0c;相当郁闷&#xff0c;查了一下才发现有些不是VC自带的&#xff0c;需要自己下…

NODE属性说明

注&#xff1a;文本节点、元素节点或者注释节点等都是Node类型的子类&#xff0c;它们继承自Node类&#xff0c;所以这里的node可以是任何一种节点类型 1.node.nodeType用来以数字值返回指定节点node的节点类型 2.node.nodeName用来返回指定节点的节点名称 如果节点是元素节点…

HTML DOM之标签操作方法

1.document.getElementById(id)方法可返回对拥有指定 ID 的第一个对象的引用 2.document.getElementsByName(name)方法可返回带有指定名称的对象的集合 3.document.getElementsByTagName(tagname)方法可返回带有指定标签名的对象的集合。如果把特殊字符串 “*” 传递给 getEle…

Vue中动态(import 、require)显示img图片

vue中&#xff0c;经常会遇到显示图片的问题&#xff0c; 如果是一个普通组件的话&#xff0c;那么这样就可以了 <img src"../assets/images/avtor.jpg" width"100%"> 上文的弊端有两个&#xff1a; 首先&#xff0c;是采用绝对路径引入。如果以…

案例精解企业级网络构建

早就听说51CTO博客出书了,但由于放假在家,没有来得及购买.现在开学了,天天上51CTO网站,博客出书的广告打的到处都是,嘿嘿!~~想不关注都不行啊!看了各位博友对这本书的好评,终于禁不住诱惑,也在网上购买了一本.今天终于收到书了.打开包装,书真的很精美.自己非常喜欢,我是一名专科…

Oracle 中 for update 和 for update nowait 的区别

原文出处http://bijian1013.iteye.com/blog/1895412 一.for update 和 for update nowait 的区别 首先一点&#xff0c;如果只是select 的话&#xff0c;Oracle是不会加任何锁的&#xff0c;也就是Oracle对 select 读到的数据不会有任何限制&#xff0c;虽然这时候有可能另外一…

HTML DOM之节点操作方法(1)

1.checkboxObject.focus()方法用于为 checkbox 赋予焦点 2.checkboxObject.blur()方法用于让 checkbox 失去焦点 3.appendChild()在子节点列表之后插入新增的子节点 注&#xff1a;您也可以使用 appendChild()方法将一个元素移动到另一个元素中 这里就将”myList2”中最后一个…

HTML DOM之节点操作方法(2)

9.document.hasFocus()方法返回布尔值&#xff0c;用于检测文档(或文档内的任一元素)是否获取焦点。没有参数 10.node.hasChildNodes()方法返回 true&#xff0c;如果指定节点拥有子节点&#xff0c;否则返回 false。没有参数 11.node.isDefaultNamespace(namespaceURI)方法返回…