C 语言
windtakers
这个作者很懒,什么都没留下…
展开
-
线性表--- 顺序表
顺序表,即线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素。详细解释及 顺序表的基本操作可以参考维基百科:http://zh.wikipedia.org/wiki/%E9%A1%BA%E5%BA%8F%E8%A1%A8VC project 练习如下:// sequence_list.cpp : Defines the entry point for the c原创 2012-10-20 11:36:02 · 594 阅读 · 0 评论 -
C 语言字符串结束符 '\0'
转载文章:http://blog.csdn.net/shuilan0066/article/details/7990362测试用例:/* ============================================================================ Name : string_size.c Author原创 2013-10-14 11:04:19 · 936 阅读 · 0 评论 -
C/C++ 二维数组、多维数组
严格来说,C/C++ 语言中并没有多维数组,通常所说的多维数组其实就是数组的数组。对于二维数组来说,常把第一个维度称作行,第二个维度称作列。看个例子,重点看下二维数组在内存中的存储:/* ============================================================================ Name : two-d原创 2013-10-14 13:37:57 · 954 阅读 · 0 评论 -
数据对齐 & 结构体的大小
数据对齐:如果一个变量的内存地址正好是它长度的整数倍,它就称作是自然对齐的。一些体系结构对对齐的要求非常严格。RISC系统,载入未对齐的数据会导致处理器陷入(一种可处理的错误,trap)。还有一些系统可以访问没有对齐的数据,只不过性能会下降。编译器会通过让所有的数据自然对齐来避免引发对齐问题。看一下结构体大小的计算:转载: http://blog.sina.com.cn/s转载 2013-10-14 15:26:57 · 844 阅读 · 0 评论 -
Android 堆栈攻击之 ARM 栈分析 + ARM汇编解读
想要劫持ARM 处理器,让它执行你想要的代码,从 ARM 栈攻击(Buffer overrun)入手,分析 ARM 栈溢出的原理,利用 ARM 汇编作为跳板指令,执行攻击程序。1. 栈 (Stack)介绍栈结构的文章网上很多,摘取一篇作为参考:http://hi.baidu.com/trical/item/585a24087f9b1a036c9048f0对ARM堆栈的理解 ...原创 2013-10-29 14:38:46 · 8651 阅读 · 0 评论 -
ROP 返回导向编程 攻击
之前工作中一直研究ARM 体系结构函数调用标准(AAPCS),分析栈中内存溢出对ARM 体系结构函数调用产生的影响。Android 的流行促进了hacker 对 Android root 的研究,最出名的莫过于 基于堆栈溢出攻击的 ROP gadgets ROOT方法。首先看下ROP的基本概念(摘自wiki):http://zh.wikipedia.org/wiki/%E8%B原创 2013-10-29 13:07:39 · 4273 阅读 · 0 评论 -
int or unsigned int
int 声明的变量默认是signed int 带符号的,如果需要无符号整型,必须明确声明 unsigned int.#include <stdio.h>#include <stdlib.h>int main(int argc, char *argv[]) { int i = 2147483645; int j = 2147483649; ...原创 2013-10-31 08:45:47 · 860 阅读 · 0 评论 -
Full Descending Stack
Demo:#define LOG_TAG "QIANG_DEMO_TEST"#define ATRACE_TAG ATRACE_TAG_ALWAYS#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#ifdef __ANDROID__...原创 2019-07-13 16:45:21 · 908 阅读 · 0 评论 -
char 溢出
char 类型的数据只有一个 Byte, 8bits,如果是unsigned char 的话,能表示的范围就是0 ~255,看下面的这个例子:/* ============================================================================ Name : char.c Author : qiang原创 2013-10-14 10:19:25 · 1124 阅读 · 0 评论 -
C 中for 循环语句执行顺序之我是汇编
for(i = 0; i 这样的for 语句可能再基础不过,可是理解不清楚还是容易犯错误。现在我用ARM 汇编指令分析一下这样的语句到底是怎么执行的(当你看C代码不知道代码到底是怎么执行的时候,要么查C标准,要么看熟悉的ARM 汇编)。测试用例:/* ===============================================================原创 2013-10-14 09:53:39 · 1784 阅读 · 0 评论 -
线性表--- 链表
维基百科:http://zh.wikipedia.org/wiki/%E9%93%BE%E8%A1%A8线性表的链式存储结构线性表顺序存储结构特点:它是一种简单、方便的存储结构。它要求线性元素的数据元素依次存放在连续的存储单元中。暴露的问题:1. 在做插入或删除元素的操作时,会产生大量的数据元素移动。2. 对于长度变化的线性表,要一次性地分配足够的存储空间,但这些空原创 2012-10-21 11:30:10 · 509 阅读 · 0 评论 -
深入理解访问结构体成员的方法
如果定义是结构体变量,使用 . 运算符访问结构体的成员变量。如:struct student { char* name; int age;};struct student stud1;struct student * pstud = &stud1;访问成员变量age 的方法分别为:1. stud1.age2. pstud1->age3.原创 2012-10-20 21:06:30 · 3141 阅读 · 1 评论 -
C语言malloc/free
如果定义一个指针,然后使用malloc 分配一块堆内存作为存储空间,使用一定要注意了:1. 使用malloc 必须#include 或是 #include , 而且 NULL 也是需要包含这些头文件的,并不是C预言的关键字。2. 首先需要定义一个指向某种数据类型指针,然后需要使用malloc 函数分配一定的存储空间,malloc 会返回分配指定大小的存储空间的首地址。3. 指针以及m原创 2012-11-24 22:17:19 · 861 阅读 · 0 评论 -
内存对齐
在嵌入式底层开发中经常会遇到内存对齐的问题,整理一下吧:1. 内存对齐的概念对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的。2. 内存对齐的原因需要内存对齐的根本原因在于CPU访问数据的效率问题。假设整型变量的地址不是自然对齐,比如为0x000原创 2013-03-05 11:37:26 · 815 阅读 · 0 评论 -
栈
栈的使用很频繁,准确的理解栈很重要。首先,回顾下ARM 上的栈:转载: http://blog.163.com/modeng_2005/blog/static/26561120097753251708/?fromdm&fromSearch&isFromSearchEngine=yes以下是我在学习ARM指令中记录的关于堆栈方面的知识:1、寄存器 R13 在 ARM 指...原创 2013-03-07 15:41:31 · 1150 阅读 · 0 评论 -
C语言 volatile 修饰符
转载:http://baike.baidu.com/view/608706.htmhttp://www.cnblogs.com/chio/archive/2007/11/24/970632.html volatile的作用: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值.简单地说就是防止编译器对代码进行优化.比如如下程序: XBYTE[2原创 2013-03-06 22:32:54 · 773 阅读 · 0 评论 -
C语言 打印文件名,行号,函数名
C 语言中可以使用 __FILE__, __LINE__, __func__ 分别打印文件名,函数名以及行号。在VIM 中写这些关键字的时候是会变颜色的,可以根据颜色变化检查笔误。/* This is a non __init function. Force it to be noinline otherwise gcc * makes it inline to init() and原创 2013-04-12 16:04:19 · 8786 阅读 · 0 评论 -
linux C: lseek 获取文件长度
转载:http://baike.baidu.com/view/1080860.htm简介函数名: lseek功 能: 移动文件读/写指针头文件:#include #include 用 法: off_t lseek(int handle, off_t offset, int fromwhere);所有打开的文件都有一个当前文件偏移量(current file off转载 2013-05-27 10:51:39 · 6729 阅读 · 0 评论 -
do {} while(0)
原创 2013-05-27 10:25:47 · 781 阅读 · 0 评论 -
可执行文件的段
可执行程序包括BSS段、数据段、代码段(也称文本段)。BSS(Block Started by Symbol)通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域。特点是:可读写的,在程序执行之前BSS段会自动清0。所以,未初始的全局变量在程序执行之前已经成0了。 注意和数据段的区别,BSS存放的是未初始化的全局变量和静态变量,数据段存放的是初始化后的全局变量和静态变量转载 2013-03-05 16:31:16 · 1518 阅读 · 0 评论