软件开发环境
无心流泪
这个作者很懒,什么都没留下…
展开
-
软件开发环境之开篇
这学期学习了软件开发环境这门课程,课程还是很有深度的,可以单独做个类别记录下。原创 2013-10-05 14:25:44 · 1107 阅读 · 0 评论 -
直接构造汇编指令
既然我们发现了指令不过就是一些字节的组合,我们可以尝试抛开C语言,自己构造指令执行。我们完全可以分配一段内存,然后将mov指令的机器码填入。但是,如何让CPU执行我们的代码呢? 假定我们构造了一段mov指令,需要用jmp语句跳转到该指令。 如果我们执行完mov指令后就不管了的话,我们就会发现程序会异常退出。比如下面的程序#include "stdafx.h"#include原创 2013-11-12 16:33:09 · 1115 阅读 · 0 评论 -
一个全局变量的例子
这个实例运行在VS2008当中,旨在帮助我们熟悉VS2008当中的调试,反汇编等基本操作。并帮助理解汇编语言。基本调试方法Debug or ReleaseF10:单步执行,不进入函数F11:单步执行,要进入函数F5:启动调试断点:程序某一行可以设上断点,程序调试经过该处将会停下来。此时可以查看变量、内存、寄存器等值 F9 #include "stdafx.原创 2013-11-12 15:20:05 · 2201 阅读 · 0 评论 -
理解指针
C语言学习的重点之一就是指针。通过反汇编,能够直接透视指针的本质指针是什么?指针存储了内存的地址,是一个存储空间,其中存放内存中的地址信息,指针是有类型的,如int*、float*因此,我们猜想指针变量应该存储有这两方面的信息,地址和指针类型,如:struct pointer{long address; //地址int type; //指针的类型};原创 2013-11-12 20:02:19 · 1013 阅读 · 0 评论 -
电话本------改进值分离命令和参数
通过cmd[3]=0、strcpy(file, cmd + 4)实现命令的解析,比较诡异。必须要知道命令头只有三个字节的秘密若将来命令格式发生变化,麻烦大了只有在while循环中改动,除了要理解命令解析外,还要理解其他很多语义另外,其他命令解析,也需要进行strcpy,重复就是罪恶!需要把命令解析的功能提取处理另一个问题:要输入“-ld c:\test”后,再输入“-ld”原创 2013-12-05 10:52:48 · 800 阅读 · 0 评论 -
C中->和.有什么区别
#include #include typedef struct Node{ int a; int b;}node;int main(){ node *aa; int b = aa.a; node bb; int c = bb->a;} 上面的程序有两处错误;->是指针指向其成员的运算符.是结构体的成原创 2013-12-05 16:23:21 · 805 阅读 · 0 评论 -
C++在delete指针之后是否要置为null
delete一个指针之后,只是回收指针指向位置的空间,而指针本身的值不变(也就是说还是指向那个地址的)。你需要手工将其赋值为NULL。现在对于printf的反汇编代码不太熟悉,以后写个实例分析一下。原创 2013-12-05 10:01:40 · 5407 阅读 · 0 评论 -
关于int型和char型之间的转换
我们将一个整型变量赋值给一个char型变量的话,就是将相应的ASCII码值的字符送入s变量 ASCII码 48 代表 ‘0’ ASCII 1 代表笑脸 ASCII码 0 代表'\0' 于是char s = 1 ;我们得到的将是笑脸 char s = 48;我们得到 0 char s = 0; 我们得到‘\0’ 当我们需要得到一个char型原创 2013-12-05 10:29:13 · 2549 阅读 · 0 评论 -
电话本--------分离命令和输入参数
// 2.16.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include const unsigned int MAX_LENGTH_OF_CMD = 300;const char* DEFAULT_FILE_NAME = "temp.txt";/*strDefaultFileFullPath要确保足够的存储空间,建原创 2013-12-05 10:31:34 · 861 阅读 · 0 评论 -
电话本-----添加错误命令处理
如果输入错误命令,返回提示信息// 2.18.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include const unsigned int MAX_LENGTH_OF_CMD = 300;const unsigned int MAX_LENGTH_OF_CMD_HEAD = 10;const char* DEFA原创 2013-12-05 11:40:10 · 799 阅读 · 0 评论 -
电话本------分拆while循环里面的处理函数
// 2.19.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include const unsigned int MAX_LENGTH_OF_CMD = 300;const unsigned int MAX_LENGTH_OF_CMD_HEAD = 10;const char* DEFAULT_FILE_NAME = "原创 2013-12-05 11:46:52 · 795 阅读 · 0 评论 -
memcpy函数
void *memcpy(void *dest, const void *src, size_t n);从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中C语言中使用#include ;C++中使用#include 和#include 都可以。前者只是为了凸显C++风格。函数返回指向dest的指针。1.source和des原创 2013-12-05 14:03:58 · 928 阅读 · 0 评论 -
电话本----产生大循环命令
// 2.14.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include const unsigned int MAX_LENGTH_OF_CMD = 300;const char* DEFAULT_FILE_NAME = "temp.txt";/*strDefaultFileFullPath要确保足够的存储空间,建原创 2013-12-05 09:00:29 · 880 阅读 · 0 评论 -
C++内嵌汇编(一):反汇编分析C++代码
http://chuanwang66.iteye.com/blog/1433218 这是一篇好文章的,赞一个! Sam: 使用binutils-2.23.1这个软件中的小工具objdump -d *.o 可以对一个目标文件进行反汇编:)了解反汇编的一些小知识对于我们在开发软件时进行编程与调试大有好处,下面以 VS2008 环境下的 VC++ 简单介绍一下反汇编的一些小东西!转载 2013-12-05 10:03:12 · 2910 阅读 · 0 评论 -
电话本------获取默认文件地址
// 2.11.cpp : 定义控制台应用程序的入口点。//#include #include #includeconst unsigned int MAX_LENGTH_OF_CMD = 300;const char* DEFAULT_FILE_NAME = "temp.txt";/*strDefaultFileFullPath要确保足够的存储空间,建议为MAX_PATH*原创 2013-12-04 22:23:00 · 822 阅读 · 0 评论 -
电话本------输出默认文件内的信息
// 2.13.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include const unsigned int MAX_LENGTH_OF_CMD = 300;const char* DEFAULT_FILE_NAME = "temp.txt";/*strDefaultFileFullPath要确保足够的存储空间,建原创 2013-12-04 22:34:57 · 834 阅读 · 0 评论 -
关于函数声明
void QueryByNameOrPhone(const char *strQueryName,const char *strQueryPhone);void QueryByNameOrPhone(const char *,const char *);两个函数声明都是可以的,变量名也是可以随意定义的原创 2013-12-05 15:52:54 · 684 阅读 · 0 评论 -
在以二进制文件打开方式打开文件的时候,fread返回值判断文件是否结束的问题
在有null值的情况下会出问题,建议使用!feof()原创 2013-12-05 22:12:57 · 1508 阅读 · 0 评论 -
问题6
int a = -5;int b = 0;………….if(a > 0){ b = 1;}else{ b = 2;}int a = -5;int b = 0;………….if(a <= 0){ b = 2;}else{ b = 1;}#include#includeint main(){ int a = -5; int原创 2013-10-05 22:05:04 · 757 阅读 · 0 评论 -
关于野指针(迷途指针)的详解
http://blog.163.com/jdxxf@126/blog/static/141007095201022172555200/C中的野指针,C++中的迷途指针(失控指针或悬浮指针)都是 不是NULL的指针,也不是指向常量的指针,而是指向“垃圾”内存的指针。“垃圾”的意思是未知区域、未知内存。一、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随转载 2013-10-05 21:19:40 · 1052 阅读 · 0 评论 -
今天遇到了一个非常恶心的错误
栈溢出。VC的默认栈的大小一般的1M或者是2M 很小 你开一个int a[1024/4]就栈溢出了今天我竟然开了一个int a[1000][1000] 的数组 算一下 足足有将近4个G 不溢出才怪呢。数组分配的太大,就必须用堆也就是malloc来分配啊,而堆内存的大小基本不说限制,但是栈的大小会受到限制,就要用malloc来分配了(当然C++当中也是可以用new来进行的),大的原创 2013-10-05 19:38:20 · 1272 阅读 · 0 评论 -
问题1
#include using namespace std;struct node{ char a; short l;};int main(){ cout << "Hello world!" << endl<<sizeof(node)<<endl; return 0;}输出结果是 Hello world !4什么是对齐?1.数原创 2013-10-05 15:27:49 · 854 阅读 · 0 评论 -
问题2
#includelong *p;void addr(){ long k; k = 0; p = &k;}void loop(){ long i,j; j=0; for(i=0;i<10;i++) { printf("%ld\n",i); (*p)--; j++; }原创 2013-10-05 15:46:56 · 832 阅读 · 0 评论 -
问题3
#includeint main(){ int i; int a[10]; for(i=0;i<=10;i++) { a[i] = 0; printf("%d\n",i); } return 0;} 这个程序会不断的输出0~9由于数组中没有a[10]在数组遍历结束之后又返回了i 直接将i原创 2013-10-05 15:51:54 · 777 阅读 · 0 评论 -
GetTickCount() 函数的作用和用法
DWORD GetTickCount(void); 1) 定义For Release configurations, this function returns the number of milliseconds since the device booted, excluding any time that the system was suspended.GetTickCo原创 2013-10-05 16:48:37 · 27649 阅读 · 0 评论 -
关于野指针(迷途指针),空指针,通用指针
int *p; 是一个随机值指针还是一个野指针?这样写叫野指针,当delete后p叫迷途指针,当再次使用时结果不可控,所以指针在初始化时应分配空间,delete后要赋为null;如果一个指针指向了非系统所分配的内存空间,那么这个指针就是我们通常所说的野指针,它的成因主要有下面两种:定义的指针没有初始化。任何指针在定义的时候,其值是随机的不确的,因此它所指向的空间不是系统分配的。in原创 2013-10-05 21:01:31 · 1154 阅读 · 0 评论 -
问题5
// test5.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include#includevoid f(){ int a[10][10]; for(int i=0; i<10; i++) for(int j=0; j<10; j++) a[i][j]原创 2013-10-05 19:59:57 · 858 阅读 · 0 评论 -
【C++学习】零散笔记
作者:gnuhpc出处:http://www.cnblogs.com/gnuhpc/问题1:expected unqualified-id before ‘using’一般都是类声明后面没有加分号导致的。类声明的时候没有加分号,还可能导致一个错误--错误:一个声明指定了多个类型问题2:类中的数据成员是不是根据前导函数的初始化顺序进行初始化的?数据成员根据它们在类定义中出现的转载 2013-10-05 21:38:27 · 1058 阅读 · 0 评论 -
问题7
将要用的文件全部缓存到内存,一定会提高访问速度吗?为什么? 缓存是提高运行速度的不二法宝比如寄存器是最快的一级缓存、二级缓存次之内存SSD一般磁盘 有可能出现Beady现象(可能不是这个单词)。就是说页错误率可能会随着所分配的帧数的增加而增加。而我们原期望值为进程增加内存(这里的Buffer)会改善性能的,所以还需要考虑页面置换算法。如果使用的是LRU或者OPT原创 2013-10-05 22:12:03 · 816 阅读 · 0 评论 -
C++笔记(1)explicit构造函数
按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示:class String {String ( const char* p ); // 用C风格的字符串p作为初始化值//…}String s1 = “hello”; //OK 隐式转换,等价于String s1 = String(“hello”);但是有的转载 2013-10-06 12:48:08 · 775 阅读 · 0 评论 -
C++笔记(2)public,private,protected关键字
1:private, public, protected 成员函数private:只能由1.该类中的函数、2.其友元函数访问。不能被任何其他访问,该类的对象也不能访问。protected:可以被1.该类中的函数、2.子类的函数、以及3.其友元函数访问。但不能被该类的对象访问。public:可以被1.该类中的函数、2.子类的函数、3.其友元函数访问,也可以由4.该类的转载 2013-10-06 13:18:56 · 853 阅读 · 0 评论 -
基于结构;基于对象;面向对象;基于接口四种C++编程思想的实例分析
版本1:结构化的思想需要实现一个加法器:在这个加法器中,已经保存了被加数;现在需要传递加数给这个加法器,以让其返回加法计算结果。结构化的基本思路:用一个结构体来保存被加数,然后再外带一个加法函数 #include using namespace std;struct SLAugend{ int iAugend;};int Add(struct SLAugend原创 2013-10-06 16:22:42 · 1035 阅读 · 0 评论 -
代码编写规范
如何学好软件开发?写程序、写程序、写程序………………..不是仅仅写一些“示例”程序,而是写好一个个具有完整功能的“能用”的程序这将不仅仅涉及到一两个独立的知识点,而是一系列的问题本章将围绕一个电话本程序展开本章的学习方法:大致查看程序结构调试、调试、调试……提前预习程序开始电话本的编写之前,先确定好一些基本的代码编写规范bool CWinContro原创 2013-10-06 17:11:06 · 965 阅读 · 0 评论 -
计算机组成-高速缓冲存储器Cache
http://blog.csdn.net/llhhyy1989/article/details/6783440以前计算机是两层存储结构:主存和辅存。 现在大多出计算机中的三层存储结构是:高速缓存Cache、主 存储器和辅助存储器。 那为什么要提出高速缓存呢? 主要的原因是为了提高存储器的平均访问速度。使存储器的速度与CPU的速度想匹配。 那高速缓存转载 2013-10-05 21:43:14 · 1254 阅读 · 0 评论 -
建议4:小心宏#define使用中的陷阱
http://book.51cto.com/art/201202/317563.htm 《编写高质量代码:改善C++程序的150个建议》本书是C++程序员进阶修炼的必读之作,包含的全部都是C++编码的最佳实践,从语法、编码规范和编程习惯、程序架构和设计思想等三大方面对C++程序和设计中的疑难问题给出了经验性的解决方案,为C++程序员编写更高质量的C++代码提供了150条极为宝贵的建议。转载 2013-10-06 20:37:31 · 973 阅读 · 0 评论 -
问题4
#include#includevoid allocateInt(int * i){ i = (int *) malloc(sizeof(int)); *i = 3;}int main(){ int *i; allocateInt(i); printf("*i = %d", *i); return 0;}这个程序有什么问题呢?i的值没有变化为什么呢?原创 2013-10-05 15:58:18 · 1018 阅读 · 2 评论 -
面向对象的三个基本特征是:封装、继承、多态。
面向对象的三个基本特征是:封装、继承、多态。 封装封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。在Java中类中成员的属性有:public, protected, , private,这四个属性的访问权限依次降低。继承面向对象编程 (转载 2013-10-06 16:31:29 · 1164 阅读 · 0 评论 -
电话程序之获取默认路径名
// 2.10.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include int _tmain(int argc, _TCHAR* argv[]){ //此时,i指向argv[0]的最后一个字符(不是0) int i = strlen(argv[0]) -1; while(i >= 0) { if(argv[0原创 2013-10-06 22:21:33 · 807 阅读 · 0 评论 -
深入C/C++之基于Cookie的安全检查(VS2005)
http://blog.csdn.net/masefee/article/details/4633305昨天在试着逆向一个有时间期限的LIB时,发现一些特别的检查函数,在之前的VC2003中是没有的,这些函数可谓是重量级函数。由于个人比较看不惯自己不懂的东西,出于不愤之情绪研究了下这些函数。首先在这里介绍个人认为较之其他几个更为重要的一种安全检查方式——基于Cookie的缓冲区溢出安全检查!转载 2013-12-15 13:33:54 · 1092 阅读 · 0 评论