<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[CDatreides的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/CDatreides</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; CDatreides]]></copyright><item><title><![CDATA[程序地址空间]]></title><link>https://blog.youkuaiyun.com/CDatreides/article/details/85047790</link><guid>https://blog.youkuaiyun.com/CDatreides/article/details/85047790</guid><author>CDatreides</author><pubDate>Mon, 17 Dec 2018 13:18:04 +0800</pubDate><description><![CDATA[我们在学习linux的时候，老师曾给我们画过这样的空间布局图。

 



由图我们并不能理解它所表达的意思，接下来用代码验证一下：



代码结果：

j

结论：根据代码结果可知，当我们fork一个进程时，它的父子进程的地址以及数据都是相同的，因此我们可以的得出父子进程创建时共享代码段以及数据段。

我们将代码稍加改动：



结果如下：



结论：从以上比较我们可以看出,代码改变之后他们的...]]></description><category></category></item><item><title><![CDATA[常见排序算法的整理]]></title><link>https://blog.youkuaiyun.com/CDatreides/article/details/84185373</link><guid>https://blog.youkuaiyun.com/CDatreides/article/details/84185373</guid><author>CDatreides</author><pubDate>Sat, 17 Nov 2018 15:03:23 +0800</pubDate><description><![CDATA[一直以来对排序算法没有深刻的理解，只能简单的代码编写，因此今天抽出一些时间对以前排序的不足加以修改。

这里我们来探讨一下常用的比较排序算法，下表给出了常见比较排序算法的性能：



稳定性的判别：如果说排序前两个相等的数位置是a,b，排序后两个数仍然是a,b，则说明这个排序是稳定的。通俗来讲就是说：排序前后两个相等的数相对位置不发生改变。

冒泡排序：

1.比较相邻的元素，如果前者大于后者，则...]]></description><category></category></item><item><title><![CDATA[解析const关键字的作用]]></title><link>https://blog.youkuaiyun.com/CDatreides/article/details/84106851</link><guid>https://blog.youkuaiyun.com/CDatreides/article/details/84106851</guid><author>CDatreides</author><pubDate>Thu, 15 Nov 2018 17:23:51 +0800</pubDate><description><![CDATA[一直以前被const和static所迷惑，每次都感觉自己知道，却每次被面试官问起时无话可说。

希望以后的你我路路顺风！

每次提及const我们都知道const可以修饰，并且被const修饰的不能更改，如果说我们每次这样回答面试官的问题，那么你就如我一样，可以回家了。

const其实是contant的缩写，意思是不变的，永恒的，它的作用也就如它的字面意思一般。只要一个变量前面用const修饰，...]]></description><category></category></item><item><title><![CDATA[解析static关键字的作用]]></title><link>https://blog.youkuaiyun.com/CDatreides/article/details/84105066</link><guid>https://blog.youkuaiyun.com/CDatreides/article/details/84105066</guid><author>CDatreides</author><pubDate>Thu, 15 Nov 2018 16:03:15 +0800</pubDate><description><![CDATA[在C语言中static的作用：

1.）修饰局部变量：static修饰的静态局部变量只执行一次，而且延长了局部变量的生命周期，随程序的结束而结束。

2.）修饰全局变量：被static修饰的全局变量只能在本文件中访问，不能再其它文件中访问。

3.）修饰函数：修饰的函数只能在本文件中调用，不能被其它文件调用。

static修饰的局部变量存放在全局数据区的静态变量区，初始化的时候自动初始化为0；
...]]></description><category></category></item><item><title><![CDATA[Given a binary tree, determine if it is a valid binary search tree (BST).]]></title><link>https://blog.youkuaiyun.com/CDatreides/article/details/82020053</link><guid>https://blog.youkuaiyun.com/CDatreides/article/details/82020053</guid><author>CDatreides</author><pubDate>Fri, 24 Aug 2018 15:45:25 +0800</pubDate><description><![CDATA[

思路：定义一个数组，按照中序输出的方式将值放入数组中，然后遍历比较，满足从小到大排列，则满足二叉搜索树。

]]></description><category></category></item><item><title><![CDATA[c++日期类]]></title><link>https://blog.youkuaiyun.com/CDatreides/article/details/81902016</link><guid>https://blog.youkuaiyun.com/CDatreides/article/details/81902016</guid><author>CDatreides</author><pubDate>Tue, 21 Aug 2018 09:50:05 +0800</pubDate><description><![CDATA[没什么好说的，感觉除了日期加减之外，剩下的也就是函数模块


#include&amp;lt;iostream&amp;gt;
using namespace std;


class Date
{
public:
	Date(int year = 2001, int month = 1,int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;...]]></description><category></category></item><item><title><![CDATA[进程与线程的区别和联系以及优缺点]]></title><link>https://blog.youkuaiyun.com/CDatreides/article/details/81842144</link><guid>https://blog.youkuaiyun.com/CDatreides/article/details/81842144</guid><author>CDatreides</author><pubDate>Sun, 19 Aug 2018 21:59:10 +0800</pubDate><description><![CDATA[什么是线程？

-在一个程序里的一个执行路线就叫做线程。更准确的定义是：线程是“一个进程内部的控制序列”。

-一切进程至少都有一个执行线程

-线程也被叫做轻量级进程

什么是进程？

-进程是程序的一个执行的实例。

-进程是正在执行的程序。

-进程是能分配处理器并由处理器执行的实体。

进程和线程

-进程是资源竞争的基本单位

-线程是程序执行的最小单位

联系：进程和线程都是操作系统所...]]></description><category></category></item><item><title><![CDATA[模拟实现僵尸进程, 孤儿进程]]></title><link>https://blog.youkuaiyun.com/CDatreides/article/details/81783798</link><guid>https://blog.youkuaiyun.com/CDatreides/article/details/81783798</guid><author>CDatreides</author><pubDate>Fri, 17 Aug 2018 22:37:25 +0800</pubDate><description><![CDATA[僵尸进程

什么是僵尸进程？

-僵尸状态是一个比较特殊的状态。当进程退出并且父进程（使用wait（）系统调用）没有读取到子进程退出的返回代码时就会产生僵尸进程。

-僵尸进程会终止状态保持在进程表中，并且会一直在等待父进程读取退出状态代码。

-所以，只要子进程退出，父进程还在运行，但父进程没有读取子进程状态，子进程进入Z状态。


  1 #include&amp;lt;stdio.h&amp;gt;
  2...]]></description><category></category></item><item><title><![CDATA[进程的调度算法以及task_struct结构各字段含义]]></title><link>https://blog.youkuaiyun.com/CDatreides/article/details/81777098</link><guid>https://blog.youkuaiyun.com/CDatreides/article/details/81777098</guid><author>CDatreides</author><pubDate>Fri, 17 Aug 2018 14:58:18 +0800</pubDate><description><![CDATA[首先，我们需要知道什么是进程？

1.进程是程序的一个执行的实例。

2.进程是正在执行的程序。

3.进程是能分配处理器并由处理器执行的实体。

按内核的观点来谈进程：它是担当分配系统资源（cpu时间，内存）的实体。

-操作系统的调度分为三种：

1.远程调度（创新进程）

2.中程调度（交互功能的一部分）

3.短程调度（下次执行哪个进程）

-进程的三种状态：

1.等待态：等待某个事件的...]]></description><category></category></item><item><title><![CDATA[输入某二叉树的前序遍历和中序遍历的结果，请重建出该二叉树。]]></title><link>https://blog.youkuaiyun.com/CDatreides/article/details/81772737</link><guid>https://blog.youkuaiyun.com/CDatreides/article/details/81772737</guid><author>CDatreides</author><pubDate>Fri, 17 Aug 2018 09:55:12 +0800</pubDate><description><![CDATA[


/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Sol...]]></description><category></category></item><item><title><![CDATA[给定一个二叉树和其中的一个结点，请找出中序遍历顺序的下一个节点并返回。]]></title><link>https://blog.youkuaiyun.com/CDatreides/article/details/81772633</link><guid>https://blog.youkuaiyun.com/CDatreides/article/details/81772633</guid><author>CDatreides</author><pubDate>Fri, 17 Aug 2018 09:52:21 +0800</pubDate><description><![CDATA[




/*
struct TreeLinkNode {
    int val;
    struct TreeLinkNode *left;
    struct TreeLinkNode *right;
    struct TreeLinkNode *next;
    TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(...]]></description><category></category></item><item><title><![CDATA[封装fork/wait等操作, 编写函数 process_create]]></title><link>https://blog.youkuaiyun.com/CDatreides/article/details/81706833</link><guid>https://blog.youkuaiyun.com/CDatreides/article/details/81706833</guid><author>CDatreides</author><pubDate>Wed, 15 Aug 2018 16:46:06 +0800</pubDate><description><![CDATA[封装fork/wait等操作, 编写函数 process_create(pid_t* pid, void* func, void* arg), func回调函数就是子进程执行的入口函数, arg是传递给func回调函数的参数. 


  
  1 #include&amp;lt;stdio.h&amp;gt;
  2 #include&amp;lt;stdlib.h&amp;gt;
  3 #include&amp;lt;unistd....]]></description><category></category></item><item><title><![CDATA[自主实现简单shell的编写]]></title><link>https://blog.youkuaiyun.com/CDatreides/article/details/81704961</link><guid>https://blog.youkuaiyun.com/CDatreides/article/details/81704961</guid><author>CDatreides</author><pubDate>Wed, 15 Aug 2018 15:43:03 +0800</pubDate><description><![CDATA[1.进程替换原理

用fork创建子进程后执行的是父进程相同的程序，但实际期望中，我们希望子进程应该执行和父进程不同的代码。所以此时，子进程需要调用exec函数以执行另一个程序，当进程调用一种exec函数时，该进程的用户空间代码和数据完全被新程序替换，并从新的程序的启动例程开始执行。调用exec并不创建新进程，所以调用exec前后该进程的id并未改变。

2.shell实现的功能

我们打开一个终...]]></description><category></category></item><item><title><![CDATA[输入一个数组，判断该数组是不是二叉搜索树的后序遍历的结果。]]></title><link>https://blog.youkuaiyun.com/CDatreides/article/details/81701523</link><guid>https://blog.youkuaiyun.com/CDatreides/article/details/81701523</guid><author>CDatreides</author><pubDate>Wed, 15 Aug 2018 11:41:19 +0800</pubDate><description><![CDATA[

解题思路：首先，我们应该对二叉搜索树有所了解。

二叉搜索树：二叉查找树（Binary Search Tree），（又：二叉搜索树，二叉排序树）它或者是一棵空树，或者是具有下列性质的二叉树： 若它的左子树不空，则左子树上所有结点的值均小于它的根结点的值； 若它的右子树不空，则右子树上所有结点的值均大于它的根结点的值； 它的左、右子树也分别为二叉排序树。

本题是利用递归思想，判断根节点的左子树...]]></description><category></category></item><item><title><![CDATA[操作给定的二叉树，将其变换为源二叉树的镜像]]></title><link>https://blog.youkuaiyun.com/CDatreides/article/details/81663424</link><guid>https://blog.youkuaiyun.com/CDatreides/article/details/81663424</guid><author>CDatreides</author><pubDate>Tue, 14 Aug 2018 11:10:33 +0800</pubDate><description><![CDATA[

思路：首先，交换根节点的左右子树的位置，然后把左右子树的根节点作为下次循环的根节点，然后向下递归。

]]></description><category></category></item><item><title><![CDATA[Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without using ex]]></title><link>https://blog.youkuaiyun.com/CDatreides/article/details/81561015</link><guid>https://blog.youkuaiyun.com/CDatreides/article/details/81561015</guid><author>CDatreides</author><pubDate>Fri, 10 Aug 2018 11:59:09 +0800</pubDate><description><![CDATA[题目为：Linked List Cycle

Given a linked list, determine if it has a cycle in it.
Follow up:
Can you solve it without using extra space?

 

解法思想：

算法思想就是设置一个快指针fp和一个慢指针sp，两个指针起始同时指向head节点，其中快指针每次走两步，慢指针...]]></description><category></category></item><item><title><![CDATA[数据结构——二叉树面试题（2）]]></title><link>https://blog.youkuaiyun.com/CDatreides/article/details/81481919</link><guid>https://blog.youkuaiyun.com/CDatreides/article/details/81481919</guid><author>CDatreides</author><pubDate>Tue, 07 Aug 2018 15:21:16 +0800</pubDate><description><![CDATA[
#pragma once

#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;assert.h&amp;gt;

typedef struct BSTreeNode {
	struct BSTreeNode * pLeft;	// prev
	struct BSTreeNode * pRight;	// next
	int d...]]></description><category></category></item><item><title><![CDATA[数据结构——二叉树面试题（1）]]></title><link>https://blog.youkuaiyun.com/CDatreides/article/details/81481818</link><guid>https://blog.youkuaiyun.com/CDatreides/article/details/81481818</guid><author>CDatreides</author><pubDate>Tue, 07 Aug 2018 15:20:10 +0800</pubDate><description><![CDATA[
#pragma once

#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;assert.h&amp;gt;

typedef char DataType;

typedef struct BTreeNode {
	struct BTreeNode *pLeft;
	struct BTreeNode *pRight;

	D...]]></description><category></category></item><item><title><![CDATA[数据结构——堆]]></title><link>https://blog.youkuaiyun.com/CDatreides/article/details/81481700</link><guid>https://blog.youkuaiyun.com/CDatreides/article/details/81481700</guid><author>CDatreides</author><pubDate>Tue, 07 Aug 2018 15:13:36 +0800</pubDate><description><![CDATA[
#pragma once

#include &amp;lt;assert.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;

typedef struct Heap {
	int	array[100];
	int	size;
}	Heap;

void HeapInit(Heap *pH...]]></description><category></category></item><item><title><![CDATA[数据结构——二叉树]]></title><link>https://blog.youkuaiyun.com/CDatreides/article/details/81167493</link><guid>https://blog.youkuaiyun.com/CDatreides/article/details/81167493</guid><author>CDatreides</author><pubDate>Mon, 23 Jul 2018 14:46:56 +0800</pubDate><description><![CDATA[
#pragma once
#include&amp;lt;stdio.h&amp;gt;
#include&amp;lt;stdlib.h&amp;gt;
#include&amp;lt;assert.h&amp;gt;
#include&amp;lt;string.h&amp;gt;
#include&quot;Queue.h&quot;
typedef char DataType;
typedef struct TreeNode{
	struct TreeNode *ple...]]></description><category></category></item></channel></rss>