C/C++
year_9
这个作者很懒,什么都没留下…
展开
-
数据结构之排序--选择类排序
三 选择类排序 基本思想:从待排数列中选出最小的记录,放到已排好序的元素之后,直至所有元素排序完毕!1. 直接选择排序 初始时:有序区为空,无序区即待排数列 第一趟,从无序区中选出最小的,与无序区的第一个元素交换。新的有序区多一个元素,新的无序区少一个元素,有序区在无序区之前! 第二趟,...... ............#define SWA原创 2013-11-18 00:10:13 · 792 阅读 · 0 评论 -
关于在头文件中实现函数的情况
下面举个例子,这个例子只有3个文件/* fun.h */#ifndef FUN_H#define FUN_Hvoid base(){};void fun();#endif /* fun.c */#include "fun.h"void fun(){ base();}/* main.c */#include "fun.h"int main(){ f原创 2013-12-04 01:41:43 · 2044 阅读 · 0 评论 -
说说C中的malloc和free
malloc是申请一块内存,free是释放一块内存!说到内存,必然要说指针,指针指向某块内存嘛。如:某函数内定义一个指针变量,并为其申请一块内存,让这个指针指向这块内存!此时,指针变量本身存在函数的栈区(调用函数时,创建栈区;调用结束时,栈区销毁) 而这块内存是存放在堆区的!这里有个错误的结论:函数调用结束时,在栈内的指针销毁的同时,它指向的内存也被销毁!它们是没有关系的,堆原创 2013-11-28 11:43:51 · 650 阅读 · 0 评论 -
linux下生成.so文件和.a文件
linux下生成.so文件和.a文件test.h1 #ifndef _TEST_H_2 #define _TEST_H_3 4 void TestA();5 void TestB();6 7 #endiftest_a.cpp1 #include 2 #include "test.h"3 4 void TestA()5 {转载 2013-12-04 02:19:42 · 635 阅读 · 0 评论 -
宏函数和函数的区别
函数和宏函数的区别就在于,宏函数占用了大量的空间,而函数占用了时间。大家要知道的是,函数调用是要使用系统的栈来保存数据的,如果编译器里有栈检查选项,一般在函数的头会嵌入一些汇编语句对当前栈进行检查;同时,CPU也要在函数调用时保存和恢复当前的现场,进行压栈和出栈操作,所以,函数调用需要一些CPU时间。 而宏函数不存在这个问题。宏函数仅仅作为预先写好的代码嵌入到当前程序,不会产生函数调用,所转载 2013-12-04 02:02:37 · 555 阅读 · 0 评论 -
二叉树
1. 二叉树节点的创建(初始化)* * tree.c */#include #include "tree.h"struct tree_node *tree_node_create(data_t data){ struct tree_node *tmp = malloc(sizeof(*tmp)); tmp->data = data; tmp->left原创 2015-10-12 16:18:37 · 458 阅读 · 0 评论 -
数据结构之队列
一 链式队列数据结构:两个指向节点的指针front, rear; 当链队为空时,front和rear都指向头节点,因此出队时,删除队尾节点时要注意!link_queue.h 1 typedef int type_t; 2 typedef enum {false, true} bool; 3 4 struct queue_nod原创 2015-10-12 16:19:25 · 448 阅读 · 0 评论 -
数据结构之排序--插入类排序
一. 插入类排序1. 直接插入排序2. 二分插入排序3.希尔排序 希尔排序优于直接插入排序。理由:1> 当待排数列大致有序时,比较和移动的次数较少(比较后才移动,比较的少自然移动的少,移动的少比较的也少) 2> 当待排数列元数个数较少时,n 与 n^2 的差距也小。即O(n)与O(n^2)差不多 3>希尔排序刚开始时,增量大,分组多,之后增量减原创 2013-11-17 11:53:54 · 987 阅读 · 0 评论 -
构造函数与析构函数的起源
作为比C更先进的语言,C++提供了更好的机制来增强程序的安全性。C++编译器具有严格的类型安全检查功能,它几乎能找出程序中所有的语法问题,这的确帮了程序员的大忙。但是程序通过了编译检查并不表示错误已经不存在了,在“错误”的大家庭里,“语法错误 ”的地位只能算是小弟弟。级别高的错误通常隐藏得很深,就象狡猾的罪犯,想逮住他可不容易。根据经验,不少难以察觉的程序错误是由于变量没有被正确初始化或清除造转载 2013-12-04 18:16:16 · 521 阅读 · 0 评论 -
造成segment fault,产生core dump的可能原因
在程序运行的过程中,有的时候我们会遇到Segment fault(段错误)这样的错误。这种看起来比较困难,因为没有任何的栈、trace信息输出。该种类型的错误往往与指针操作相关。1、内存访问越界a) 由于使用错误的下标,导致数组访问越界b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符c) 使用strcpy, strcat, spr转载 2013-12-04 02:05:45 · 967 阅读 · 0 评论 -
头文件的循环依赖问题
比如,有三个头文件a.h(引用b.h), b.h(引用c.h) c.h(引用a.h)就会造成文件的循环依赖!后果,很可怕!比如有个文件a.c,上面有#include "a.h",那在a.c文件编译之前,预处理程序就会不断的把这三个头文件的内容复制过来,超过了一定的数量,就会导致“头文件数太多”的编译错误。解决方法呢,当然就是常见的#i转载 2013-12-04 01:56:52 · 6589 阅读 · 1 评论 -
测试本机的大小端模式
1. 什么是大小端模式?区别? (小端存储模式和大端存储模式) 如数字0x1234,低字节位是0x34,高字节位是0x12。 假设从地址0x4000处开始存放 内存地址 小端模式(little-endian) 大端模式(big-endian) 0x4000 0x34原创 2013-11-28 10:34:57 · 884 阅读 · 0 评论 -
[C/C++]写出几个无限循环
1. 写出几个死循环while (1) {}注:1不可省略for ( ; ; ) {}注:第一个条件为初始条件,第二个条件是循环结束条件,第三个表达式是变更表达式 循环结束条件若是省略的话,应写入循环体中。此时循环体中没有结束条件(此时程序已进入循环),故程序将一直执行。。。for(;;)编译成汇编后是无条件转移,while(1)原创 2013-11-11 16:17:24 · 7675 阅读 · 0 评论 -
[C/C++]const的作用
首先:const修饰的变量是“只读变量”!如果你说成是“常量“,那说明你是个业余者,虽然你明白它是干嘛的。表达时尽量标准,趋近于专业!关于const最简单的一句“const意味着只读”! 这是一句正确的答案,但是这不够详细,不够深入!下面几个句应该知道是什么意思:1. const int a;2. int const a; 这两句是一个意思:a是“只读的”,即原创 2013-11-11 12:58:54 · 778 阅读 · 0 评论 -
warning:initialization discards ‘const’ qualifier from pointer target type 解决方法
initialization discards ‘const’ qualifier from pointer target type意思是,初始化时丢掉了(目标类型的)‘const’限定符eg: const int a = 9; int *pa = &a;就会报这个警告!方法一:const int *pa = &a;方法二:int *pa = (int *)&a; 这种原创 2013-11-11 12:13:59 · 21205 阅读 · 0 评论 -
C++中引用和指针的区别
引用可看作是某变量的别名,对引用进行操作就像操作原变量(直接操作)!主要在函数传递参数时使用,如SWAP函数指针的值存的是变量的地址,通过操作指针可以间接操作变量!区别: 1.引用声明时必须指定引用的对象,指针不必 2.引用不能为空,指针可以为NULL 3.引用一旦声明就不能改变,指针可以指向不同的对象 4.引用访问对象是直接访问,指原创 2013-11-10 20:20:31 · 700 阅读 · 0 评论 -
数组名和指针的区别
只有在作为函数的参数时,数组名和指针才是相同的(即“数组名就是指针”,只适用于这种情况)!其余情况一律不同!第一:数组名不是指针!它们的大小不同第二:数组名很像指针!比如,数组名可以赋给指针。又比如strcpy函数是以字符型指针为参数,但是我们可以传给它数组名!数组名的本质:1.数组名的内涵在于指代实体是一种数据结构,这种数据结构就是数组。(数组名带指一种数据结构:数组)转载 2013-11-10 12:25:56 · 710 阅读 · 0 评论 -
数据结构之排序--归并排序
四 归并排序归并:把若干个有序的数列, 合成一个有序的数列如二路归并:void merge(int d1[], int len1, int d2[], int len2, int tmp[]){ int i, j, k; i = j = k = 0; while (i < len1 && j < len2) { if (d1[i] > d2原创 2013-11-18 15:44:55 · 522 阅读 · 0 评论 -
几段关于const的代码
1. 改变const修饰的“只读变量”#include int main(){ const int a = 9; int *pa = (int *)&a; *pa = 10; printf("a = %d\n", a); return 0;}2. memmove(void *dest, const void *src, si原创 2013-11-11 13:20:43 · 795 阅读 · 0 评论 -
[error]stack smashing detected
字符串成功打印出来后,但是竟然报这个错:(栈溢出)*** stack smashing detected ***: ./test terminatedAborted (core dumped)结果都已经出来为什么报这个错呢?既然结果已经出来,推测应该不是算法(strnat1)的问题。下面是调用处的代码int main(){ char str[] = "123456原创 2013-11-13 12:57:01 · 1863 阅读 · 0 评论 -
数据结构之排序--交换类排序
二 交换类排序 基本思想是:两两比较待排序记录的关键字,发现两记录的次序相反时即进行交换,直到没有反序的记录为止!1. 冒泡排序 冒泡的原则:轻气泡不能在重气泡之下! 如何进行?从下到上扫描待排记录,凡违反冒泡原则的轻气泡就向上“漂浮”。如此反复进行,直到任意两个气泡,都是轻者在上,重者在下!void bubble_sort(int a[], int len)原创 2013-11-17 16:19:32 · 1020 阅读 · 0 评论