一个很有深度的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;返回值是指定…

input框在ios中的阴影问题

在IOS下&#xff0c;input 和textarea表单默认会有个内阴影&#xff0c;一定程度上影响视觉一致&#xff0c;可通过设置下面代码去掉&#xff1a; input{ -webkit-appearance: none; }

React开发(123):ant design学习指南

// 表单组件<Form><Button><Input><InputNumber> //所有输入数字的地方要使用此组件 <Radio><Select><DatePicker><TreeSelect>// 数据展示|布局组件<Card><Tabs><Table>//反馈交互组件<Modal><…

40种网站设计常用方法

1. οncοntextmenu"window.event.returnValuefalse" --将彻底屏蔽鼠标右键<table border οncοntextmenureturn(false)><td>no</table> 可用于Table2. <body onselectstart"return false"> 取消选取、防止复制3. οnpaste"…

无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用

一&#xff0c;问题描述 MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 _WinMain16&#xff0c;该符号在函数 ___tmainCRTStartup 中被引用 Debug\jk.exe : fatal error LNK1120: 1 个无法解析的外部命令 error LNK2001: unresolved external symbol _WinM…

常见位操作:获取,设置,清零

1 /*常见位操作&#xff1a;获取&#xff0c;设置&#xff0c;清零2 * 3 * */4 public class BitGet {5 /*6 * 该函数实现获取功能7 * 先将1左移动i位&#xff0c;左移动0位变成了00000001&#xff0c;8 * 然后再和Num十进制12转化为二进制00001100进行&a…

CSS Grid布局(2)

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

linux怎么使多条命令同时执行

一次执行多个bai命令可以将多个命令用du英文分号分割&#xff0c;比如像这样&#xff1a;zhi mkdir /tmp/mydir; touch /tmp/mydir/myfile 其实这样也倒不能算是同时执行&#xff0c;Linux的命令是顺序执行的&#xff0c;就算是shell脚本&#xff0c; 里面写了一大堆命令&#…

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

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

食品安全--牛奶和蛋白质浅谈

蛋白质才是牛奶中的主要营养成分&#xff0c;鲜牛奶的国家标准是100毫升≥2.95克&#xff0c;而纯正的生鲜牛奶的蛋白质含量一般在3&#xff05;以上&#xff0c;一般都能达到国家标准。 食品工业上检测牛奶蛋白质含量被定为国家标准的是凯氏定氮法。原理很简单&#xff1a;蛋白…

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[…

OpenGL 开发环境配置

From: http://www.cnblogs.com/kesalin/archive/2009/09/08/1562499.html OpenGL 下有一些重用的辅助库&#xff0c;比如glut,glee,glew等等&#xff0c;在windows平台下需要自己安装&#xff0c;因为微软为了推广自己的DX&#xff0c;在windows下只支持openGL 1.1版本。你可以…

CSS Grid布局(3)

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

main.js中的Vue.config.productionTip = false

开发模式&#xff1a;npm run dev是前端自己开发用的 生产模式&#xff1a;npm run build 打包之后给后端放在服务端上用的 Vue.config.productionTip false 1 上面这行代码的意思 是阻止显示生产模式的消息。 如果没有这行代码&#xff0c;或者设置为true&#xff0c;控制台就…

VS 2010 OpenGL 配置与实例开发

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

《COM原理与应用》学习笔记二——COM对象和COM接口的实现

COM对象是给用户提供服务的封装的实体。这个应该和C中类的对象理解起来是相似的。但是有时候也把COM对象当作提供服务的那个类。COM对象也对数据进行了封装&#xff0c;然后也提供了接口。不过和类还是有一些不一样的。类中的数据可以申明为public&#xff0c;然后让用户能够直…

禁止ipc$默认共享的方法

以下四种方法可以参考一下: A、一种办法是把ipc$和默认共享都删除了。但重起后还会有。这就需要改注册表。 1&#xff0c;先把已有的删除 net share ipc$ /del net share admin$ /del net share c$ /del …………&#xff08;有几个删几个&#xff09; 2&#xff0c;禁止建立空…