存档

‘C语言’ 分类的存档

计算结构体成员偏移值offsetof

2011年11月16日 6 条评论

    一个比较有意思的宏,不知道大家见得多不多。我见得不多,但是偶尔也会用一下。最早看到offsetof这个宏,不知道是从哪里看到的一道面试题,就是求结构体的成员相对于结构体的偏移值,第一个想到的方法当然是对结构体变量的成员和对应的结构体变量取地址操作然后相减;如果不定义结构体变量,那么又该如何操作呢?这时候offsetof就派上用场了,当然,我们感兴趣的是offsetof的内部实现。
下面这段代码是我从Visual Studio 2005的里面复制出来[......]

继续阅读

分类: C语言 标签: , , ,

一个C语言结构体问题

2011年5月5日 4 条评论

无聊的时候又去CSDN转转,肯定会有人讨论题目,这不,看到有人在讨论结构体了。不顾很奇怪的是,似乎所有人都被提问者误导了。先上题目:

#include <stdio.h>
// 定义一个结构体
typedef struct _DATA
{
char t;
char k;
unsigned short i;
int m;
} Data, *PData;
 
int main(int argc, char **argv)[......]

继续阅读

分类: C语言 标签: , ,

swprintf和wsprintf

2011年3月24日 没有评论

wsprintf是Windows API,不支持浮点型格式输出;swprintf是C运行时函数,支持浮点型格式化输出。

今天写代码的时候用了wsprintf,老是输出f,各种蛋疼。

分类: C语言 标签: , ,

常见函数调用约定

2011年2月16日 没有评论

本文转载自《Reversing:逆向工程揭密》一书。该书描述的是在逆向与反逆向之间展开的一场旷日持久的拉锯战。
C.1.3 调用约定
调用约定(Calling Conventions)定义了程序中调用函数的方式。调用约定之所以与我们这里讨论的堆栈相关,是因为调用约定决定了在函数调用的时候数据(比如说参数)在堆栈中的组织方式。理解调用约定对你来说非常重要,因为在逆向过程中你会不时地遇到函数调用,准确地辨识所用的调用约定是哪一种将有助于你理解你正在解读的程序。
在讨论各个调用约定之前,我们先来讨论[......]

继续阅读

C语言union(联合体 共用体)

2011年1月13日 8 条评论

一直以来,union都是个很少用到的东西,对于这些不常用的结构往往记不住。这次看书又看到了,还是学习一下吧。
一般在Windows API的一些数据结构中才能看到这个union,其实并不复杂。本质上来说和结构体是一样的,但是从包装的角度来看有差异。

  1. union中可以定义多个成员,union的大小由最大的成员的大小决定。
  2. union成员共享同一块大小的内存,一次只能使用其中的一个成员。
  3. 对某一个成员赋值,会覆盖其他成员的值(也不奇怪,因为他们共享一块内存)

下面看一个简单的代码:

1
2
3[......]

继续阅读

分类: C语言 标签: , ,

error C2059: syntax error : ‘string’

2010年12月28日 6 条评论

今天在编译驱动代码的时候出现了一个错误,error C2059: syntax error : ‘string’,有点让人误解。网上搜了一下,发现是使用了extern “C”造成的。自己挤出不好吧。只有当在C++里面的时候,引用外部函数才需要extern “C”来声明,否则直接声明函数即可。另外,我们可以方便的通过判断是否定义__cplusplus来使得代码的可移植性更好,可以按照下面的方法来声明函数:

1
2
3
4
5[......]

继续阅读

分类: C语言 标签: , , ,

unsigned char与char的区别

2010年12月25日 3 条评论

今天在DDK处理IRP例程时遇到的问题。给char数组memset填充0XAA,输出的时候输出了FFFFAA了。o(╯□╰)o。

unsigned char是无符号字符型,取值范围是0~255;而signed char的范围是-128~127。通常编译器会把char当做signed 插入对待。切记。

8位的无符号数的表示范围是0~255,即0 ~ 2N – 1,而8位的有符号数表示范围是-2N-1~2N-1-1。

分类: C语言 标签: , ,

GDB调试手册

2010年12月13日 2 条评论

Linux 包含了一个叫gdb 的GNU 调试程序。gdb 是一个用来调试C和C++程序的强力调试器。它使你能在程序运行时观察程序的内部结构和内存的使用情况。以下是 gdb 所提供的一些功能:它使你能监视你程序中变量的值、它使你能设置断点以使程序在指定的代码行上停止执行、它使你能一行行的执行你的代码。在命令行上键入gdb并按回车键就可以运行gdb 了。(Windows需要安装MinGW或者CygWin并且需要配置环境变量才可以使用)
 

GDB 命令行参数
启动 GDB:
l&nbs[......]

继续阅读

分类: C语言 标签: , , ,

ASCII码表

2010年10月14日 5 条评论

ASCII码表(常用部分,备忘用O(∩_∩)O~)

ASCII码表,备用

分类: C语言 标签:

不完全类型

2010年9月30日 没有评论

6.11 不完全类型
ISO C 标准引入术语“不完全类型”使 C 的基本(但容易造成误解)部分形式化,这种类型的开头具有某种暗示。本节描述不完全类型、其允许位置以及它们有用的原因。
6.11.1 类型
ISO 将 C 的类型分为三个不同的集合:函数、对象和不完全。函数类型很明显;对象类型包含其他一切,除非不知道对象的大小。该标准使用术语“对象类型”指定指派的对象必须具有已知大小,但是除 void 之外的不完全类型也称为对象,知道这一点很重要。
不[......]

继续阅读

分类: C语言 标签: , , ,