demo_3_8_02


动态内存分配:

  1 #define _CRT_SECURE_NO_WARNINGS 1
  2 #include 
  3 #include 
  4 #include <string.h>
  5 #include 
  6 #include 
  7 
  8 struct S
  9 {
 10     char name[20];
 11     int age;
 12 };
 13 int main()
 14 {
 15     int n = 0;
 16     scanf("%d", &n);
 17 
 18     struct S arr[50];//存放50个struct S类型的数据
 19     //30 - 浪费
 20     //60 - 不够
 21 
 22     system("pause");
 23     return 0;
 24 }
 25 
 26 int main()
 27 {
 28     //向内存申请10个整型的空间
 29     int* p = (int*)malloc(40);//需要强制类型转换否则会error
 30     //当开辟失败的时候
 31     if (p == NULL)
 32     {
 33         //打印错误原因的方式
 34         printf("%s\n", strerror(errno));
 35         //errno把错误信息返回给用户
 36     }
 37     else{
 38         //开辟成功,正常使用空间
 39         int i = 0;
 40         for (i = 0; i < 10; i++)
 41         {
 42             *(p + i) = i;
 43         }
 44         for (i = 0; i < 10; i++)
 45         {
 46             printf("%d\n", *(p + i));
 47         }
 48     }
 49     //当动态申请的空间不再使用的时候就应该还给操作系统
 50     free(p);//程序结束的时候还回去
 51     //p虽然还给操作系统了但p依然有能力找到那块地址
 52     p = NULL;//主动把p赋值给空指针,避免犯错误再找到那个地址
 53     
 54     system("pause");
 55     return 0;
 56 }
 57 
 58 calloc - 开辟内存空间并初始化
 59 int main()
 60 {
 61     //malloc(10*sizeof(int)) - 不初始化
 62     int* p = (int*)calloc(10, sizeof(int));
 63     if (p == NULL)
 64     {
 65         printf("%s\n", strerror(errno));//把错误码所对应的错误信息打印出来
 66     }
 67     else{
 68         int i = 0;
 69         for (i = 0; i < 10; i++)
 70         {
 71             printf("%d ", *(p + i));
 72         }
 73     }
 74     //要释放空间
 75     //free函数使用来释放动态开辟的空间的
 76     free(p);
 77     p = NULL;
 78     system("pause");
 79     return 0;
 80 }
 81 
 82 //realloc - 调整动态开辟内存空间的大小
 83 int main()
 84 {
 85     int *p = (int*)malloc(20);
 86     if (p == NULL)
 87     {
 88         printf("%s\n", strerror(errno));
 89     }
 90     else{
 91         int i = 0;
 92         for (i = 0; i < 5; i++)
 93         {
 94             *(p + i) = i;
 95         }
 96     }
 97     //只是在使用malloc开辟的20个字节的空间
 98     //假设20个字节不能满足需求
 99     //希望能有40个字节的空间
100     //这里就可使用realloc来调整动态开辟的内存空间
101     
102     //realloc 函数使用注意事项:
103     //1)如果p指向的空间之后有足够的内存空间可以追加则直接追加然后返回p
104     //2)如果p指向的空间之后没有足够的内存可以追加则realloc 函数会重新找一块新的内存区域,开辟一块满足需求的空间,并且把原来内存中的数拷贝回来,释放旧的内存空间,最后返回新开辟的内存空间地址
105     //3)得用一个新的变量来接收realloc 函数的返回值
106     int* p2 = realloc(p, 40);
107     int*ptr = realloc(p, INT_MAX);
108     //ptr不为空的时候就把p赋给ptr
109     if (ptr != NULL)
110     {
111         p = ptr;
112     }
113     int i = 0;
114     for (i = 5; i < 10; i++)
115     {
116         printf("%d ", *(p2 + i));
117     }
118     //释放内存
119     free(p);
120     p = NULL;
121     //如果返回的是新地址,那么旧地址本身自动被释放掉了,此时free释放新的地址空间
122 
123     system("pause");
124     return 0;
125 }
126 
127 int main()
128 {
129     int *p = malloc(40);
130     //万一malloc失败了,则p就被赋值空指针了
131     *p = 0;//error
132 
133     int i = 0;
134     for (i = 0; i < 10; i ++ )
135     {
136         //对空指针解引用就会出问题
137         *(p + i) = i;//error
138     }
139     free(p);
140     p = NULL;
141     system("pause");
142     return 0;
143 }
144 
145 int main()
146 {
147     //这里有5个元素的内存空间
148     int *p = (int*)malloc(5 * sizeof(int));
149     if (p == NULL)
150     {
151         return 0;
152     }
153     else{
154         int i = 0;
155         //而这里却有10个内存空间
156         //越界访问 - error
157         for (i = 0; i < 10; i++)//error
158         {
159             *(p + i) = i;//起始地址+下标,然后解引用
160         }
161     }
162     free(p);
163     p = NULL;
164     system("pause");
165     return 0;
166 }
167 
168 int main()
169 {
170     int a = 10;
171     int* p = &a;
172     *p = 20;
173     //对非动态开辟内存使用free函数
174     free(p);
175     p = NULL;
176     system("pause");
177     return 0;
178 }
179 
180 int main()
181 {
182     int *p = (int*)malloc(40);
183     if (p == NULL)
184     {
185         return 0;
186     }
187     //开辟成功使用这块空间
188     int *p2 = realloc(p, 80);
189     if (p2 != NULL)
190     {
191         p = p2;
192     }
193     system("pause");
194     return 0;
195 }
196 
197 //realloc 直接开辟空间
198 int main()
199 {
200     int *p = realloc(NULL, 40);
201     system("pause");
202     return 0;
203 }
204 
205 int main()
206 {
207     //使用free 释放一块动态开辟内存的一部分
208     int*p = (int*)malloc(40);
209     if (p == NULL)
210     {
211         return 0;
212     }
213     int i = 0;
214     for (i = 0; i < 10; i++)
215     {
216         *p++ = i;
217     }
218     //释放空间
219     free(p);
220     p = NULL;
221     system("pause");
222     return 0;
223 }
224 
225 int main()
226 {
227     int *p = (int*)malloc(40);
228     if (p == NULL)
229     {
230         return 0;
231     }
232     //使用
233     //对同一块动态内存多次释放
234     free(p);
235     p = NULL;//每次使用完把p赋给空指针
236     free(p);//第二个free没有什么意义了
237     system("pause");
238     return 0;
239 }
240 
241 int main()
242 {
243     while (1)
244     {
245         //动态开辟内存忘记释放(导致内存泄漏)
246         malloc(1);
247         Sleep(1000);
248     }
249     system("pause");
250     return 0;
251 }
252 
253 
254 //改正一
255 void GetMemory(char **p)
256 {
257     p = (char *)malloc(100);
258     //未释放
259 }
260 void Test(void)
261 {
262     char *str = NULL;
263     GetMemory(str);//非法访问内存,导致程序崩溃
264     strcpy(str, "hello world");
265     printf(str);
266     free(str);
267     str = NULL;
268     //出现的问题
269     //1.运行代码程序会出现崩溃的现象
270     //2.程序存在内存泄漏的问题
271         //str 以值传递的形式给p
272         //p 是GetMemory函数的形参,只能函数内部有效
273         //等GetMemory 函数返回之后,动态开辟内存尚未释放,并且无法找到,所以会造成内存泄漏
274 }
275 int main()
276 {
277     Test();
278     char *str = "abcdef";
279     printf("%s\n", str);
280     printf(str);
281     printf("abcdef");
282     system("pause");
283     return 0;
284     //最终原因是程序崩溃
285 }
286 
287 
288 //改正二
289 char* GetMemory(char *p)
290 {
291     p = (char *)malloc(100);
292     return p;
293     //未释放
294 }
295 void Test(void)
296 {
297     char *str = NULL;
298     str = GetMemory(str);//非法访问内存,导致程序崩溃
299     strcpy(str, "hello world");
300     printf(str);
301     free(str);
302     str = NULL;
303     //出现的问题
304     //1.运行代码程序会出现崩溃的现象
305     //2.程序存在内存泄漏的问题
306     //str 以值传递的形式给p
307     //p 是GetMemory函数的形参,只能函数内部有效
308     //等GetMemory 函数返回之后,动态开辟内存尚未释放,并且无法找到,所以会造成内存泄漏
309 }
310 int main()
311 {
312     Test();
313     /*char *str = "abcdef";
314     printf("%s\n", str);
315     printf(str);
316     printf("abcdef");*/
317     system("pause");
318     return 0;
319     //最终原因是程序崩溃
320 }