• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C语言中的数组和指针汇编代码分析实例

C语言中的数组和指针汇编代码分析实例

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c语言指针数组,c语言二维数组指针,c语言函数指针数组,c语言中数组指针,c语言指针指向数组等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

今天看《程序员面试宝典》时偶然看到讲数组和指针的存取效率,闲着无聊,就自己写了段小代码,简单分析一下C语言背后的汇编,可能很多人只注重C语言,但在实际应用当中,当出现问题时,有时候还是通过分析汇编代码能够解决问题。本文只是为初学者,大牛可以飘过~

C源代码如下:
#include "stdafx.h"
int main(int argc, char* argv[])
{
       char a=1;
       char c[] = "1234567890";
       char *p = "1234567890";
       a = c[1];
       a = p[1];
       return 0;
}
</div>

在VC6.0下查看汇编代码步骤:
在main函数中靠前的部分随便一行F9设置断点->编译->F5 在调试界面中右键->Go to disassembly

Debug汇编代码(已加注释):
4:    #include "stdafx.h"
5:
6:    int main(int argc, char* argv[])
7:    {
00401010   push        ebp    
00401011   mov         ebp,esp      ;保存栈帧
00401013   sub         esp,54h        ;抬高栈顶
00401016   push        ebx
00401017   push        esi
00401018   push        edi                     ;压入程序中用到的寄存器,以便恢复
00401019   lea         edi,[ebp-54h]            
0040101C   mov         ecx,15h
00401021   mov         eax,0CCCCCCCCh
00401026   rep stos    dword ptr [edi]    ;栈顶与栈帧之间的数据填充为0xcc,相当于汇编中的int 3,这是因为debug模式下把Stack上的变量都初始化为0xcc,检查未初始化的问题
8:        char a=1;
00401028   mov         byte ptr [ebp-4],1      ;ebp-4是为变量a分配的空间地址
9:        char c[] = "1234567890";
0040102C   mov         eax,[string "1234567890" (0042201c)]
00401031   mov         dword ptr [ebp-10h],eax   ;“1234567890”是字符串常量,存储在地址0042201c处,ebp-10是为数组C分配的空间的首地址,空间大小从ebp-0x10到ebp-0x04,共12个字节。本句中先把“1234”这4个字节拷贝到数组C中
00401034   mov         ecx,dword ptr [string "1234567890" 4 (00422020)]
0040103A   mov         dword ptr [ebp-0Ch],ecx  ;作用同上,把“5678”这4个字节拷贝到数组C中
0040103D   mov         dx,word ptr [string "1234567890" 8 (00422024)]
00401044   mov         word ptr [ebp-8],dx   ;作用同上,把“90”这2个字节拷贝到C中
00401048   mov         al,[string "1234567890" 0Ah (00422026)]
0040104D   mov         byte ptr [ebp-6],al    ;这个大家都熟,不要忘了\0
10:       char *p = "1234567890";
00401050   mov         dword ptr [ebp-14h],offset string "1234567890" (0042201c) ;ebp-0x14是为指针p分配的空间地址,大小是4个字节,地址中的值是字符串“1234567890”的首地址
11:       a = c[1];
00401057   mov         cl,byte ptr [ebp-0Fh]  ;这里是重点,因为数组C在栈上连续存储,很容易根据ebp找到第其中一个字符的地址,并取值,赋给cl
0040105A   mov         byte ptr [ebp-4],cl     ;完成赋值
12:       a = p[1];
0040105D   mov         edx,dword ptr [ebp-14h]  ;这里与上面就有区别,因为根据ebp只知道指针p的值,先得到p的值,即先得到一个指针
00401060   mov         al,byte ptr [edx 1]    ;根据得到的指针间接的找到字符串中的一个字符
00401063   mov         byte ptr [ebp-4],al
13:       return 0;
00401066   xor         eax,eax         ;eax清0,作为main函数的返回值
14:   }
00401068   pop         edi
00401069   pop         esi
0040106A   pop         ebx
0040106B   mov         esp,ebp
0040106D   pop         ebp     ;恢复ebp
0040106E   ret
</div>

好了,可以看到,用数组访问元素,只需2步,而用指针时要3步。可见数组和指针并不相同,有时候大家都认为可以把数组的名称看成一个指针,这种想法有时候没错,但有时候却会出错。我再举一个简单的例子,而下面的这个例子可能是大家在开发过程中经常会碰到的问题。

在文件test.cpp中:
#include "stdafx.h"
#include "inc.h"
extern char chTest[10];
int main(int argc, char* argv[])
{
       printf("chTest=%s\n", chTest);
       return 0;
}
</div>

上面有个extern声明,表明chTest数组是在外部文件中定义过的。chTest定义在inc.h中:
char chTest[10]="123456789";
</div>

上述的程序,经编译后,可以成功运行。但如果把红色的代码改成如下:
extern char *chTest;
</div>

这时,程序在编译的时候就会通不过,提示的错误信息是:redefinition; different types of indirection,但这时候

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C语言 指针与数组的详解及区别
  • C语言 指针与二维数组详解
  • C语言 指针数组详解及示例代码
  • C语言 数组指针详解及示例代码
  • 直观理解C语言中指向一位数组与二维数组的指针
  • 举例理解C语言二维数组的指针指向问题
  • 简单分析C语言中指针数组与数组指针的区别
  • C语言中二维数组指针的简要说明
  • C语言中的数组和指针汇编代码分析实例
  • C语言安全之数组长度与指针实例解析

相关文章

  • 2017-05-28C++ operator关键字(重载操作符)的用法详解
  • 2017-05-28C++中的几种排序算法
  • 2017-05-28浅析char 指针变量char *=p 这个语句的输出问题
  • 2017-05-28C++中实现队列类链式存储与栈类链式存储的代码示例
  • 2017-09-20more effective C++在未来时态下发展程序
  • 2017-05-28java 中ArrayList与LinkedList性能比较
  • 2017-05-28C++实现接两个链表实例代码
  • 2017-05-28C语言的语法风格与代码书写规范指南
  • 2017-05-28C语言中结构体(struct)的几种初始化方法
  • 2017-05-28C++实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 快速解决boost库链接出错的问题(分享)
    • C语言之没有main函数的helloworld示例
    • 在C语言中调用C++做的动态链接库
    • Cocos2d-x保存用户游戏数据之XML文件是否存在问题判断方法
    • C语言中6组指针和自增运算符结合方式的运算顺序问题
    • c语言实现顺序表的基本操作
    • 解析C++中多层派生时的构造函数及一些特殊形式
    • C++中四种加密算法之DES源代码
    • 关于双向链表的增删改查和排序的C++实现
    • C++中获取UTC时间精确到微秒的实现代码

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有