c/c++面试39-44之内存动态分配

39 指针的初始化(二叉树排序),其中引入了双向链表

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 struct Tag_Node
 5 {
 6     struct Tag_Node *left;
 7     struct Tag_Node *right;
 8     int value;
 9 };
10 typedef struct Tag_Node TNode;
11 
12 TNode* root = NULL;
13 
14 void append(int N);
15 void print();
16 
17 int main()
18 {
19     append(63);
20     append(45);
21     append(32);
22     append(77);
23     append(96);
24     append(21);
25     append(17);
26     printf("head:%d
", root->value);
27     print();
28     getchar();
29 }
30 
31 void append(int N)
32 {
33     TNode *NewNode = (TNode *)malloc(sizeof(TNode));
34     NewNode->value = N;
35     NewNode->left = NULL;//初始化这里很重要
36     NewNode->right = NULL;
37 
38     if (root == NULL)
39     {
40         root = NewNode;//就指向根节点
41         return;
42     }
43     else
44     {
45         TNode *temp =  NULL;
46         temp = root;
47         while ((N >= temp->value&&temp->left != NULL)||(N<temp->value&&temp->right!=NULL))
48         {
49             while (N >= temp->value&&temp->left != NULL)
50             {
51                 temp = temp->left;
52             }
53             while (N <= temp->value&&temp->right != NULL)
54             {
55                 temp = temp->right;
56             }
57         }
58         if (N >= temp->value)
59         {
60             temp->left = NewNode;
61             NewNode->right = temp;//形成双向链表
62         }
63         else
64         {
65             temp->right = NewNode;
66             NewNode->left = temp;
67         }
68         return;
69         
70     }
71 }
72 
73 void print()
74 {
75     TNode* leftside = NULL;
76 
77     if (root == NULL)
78     {
79         printf("there is not any element");
80         return;
81     }
82     leftside = root->left;
83 
84     while (1)
85     {
86         if (leftside->left == NULL)
87         {
88             break;
89         }
90         leftside = leftside->left;
91     }
92     while (leftside != NULL)
93     {
94         printf("%d ", leftside->value);
95         leftside = leftside->right;
96     }
97 }
View Code

40 有了malloc/free为什么还要new/delete

(1) malloc与free是c/c++标准库函数,new/delete是c++的运算符,都可以用于动态内存申请和释放

(2) 对于非内部数据类型对象而言,对象在消亡之前会自动执行析构函数。由于malloc是库函数不是运算符,不在编译器的控制权限之下,不能把执行构造和下强加于malloc上。

41 各种内存分配和释放的函数联系和区别

(1)malloc类型为(void *),记住强制类型转换,另外参数是size,表示在内存的动态存储区分配一块连续的长度为size的空间

(2)calloc(n,size)在内存动态存储区中分配n块长度为size自己的连续区域,返回首地址

(3)realloc(*ptr,size)蒋ptr内存大小增加到size,新增加的内存没有初始化

42 内存分配的方式有几种

(1)从静态存储区域分配。

(2)栈上创建。

(3)堆上分配,自己管理

43 什么是句柄

(1) 句柄是标识项目的,其中包括内存块,菜单等

(2)windows采用以虚拟内存为基础的操作系统。内存管理器需要不断的移动来满足应用程序的内存需要。移动地址就变化了,这样windows为各个应用程序腾出一部分地址用来专门的登记各个应用对象在内存中的地址变化,这个存储单元的位置的地址本身不变化。这样就相对可以间接的访问了。

44 指针与句柄有什么区别

(1)句柄所指的是一个很复杂的结构,很有可能是与系统相关的。可以想成是指向指针的指针。

(2)指针也可以指向一个非常复杂的结构,但是通常是自己定义的。

原文地址:https://www.cnblogs.com/lanjianhappy/p/8006204.html