第42课 内存操作经典问题分析2

Posted wanmeishenghuo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第42课 内存操作经典问题分析2相关的知识,希望对你有一定的参考价值。

常见内存错误:

技术分享图片

 

两次释放同一个指针是有问题的。

示例:

 1 #include <stdio.h>
 2 #include <malloc.h>
 3 
 4 void test(int* p, int size)
 5 {
 6     int i = 0;
 7     
 8     for(i=0; i<size; i++)
 9     {
10         printf("%d
", p[i]);
11     }
12     
13     free(p);
14 }
15 
16 void func(unsigned int size)
17 {
18     int* p = (int*)malloc(size * sizeof(int));
19     int i = 0;
20     
21     if( size % 2 != 0 )
22     {
23         return; 
24     }
25     
26     for(i=0; i<size; i++)
27     {
28         p[i] = i;
29         printf("%d
", p[i]);
30     }
31     
32     free(p);
33 }
34 
35 int main()
36 {
37     int* p = (int*)malloc(5 * sizeof(int));
38     
39     test(p, 5);
40     
41     free(p); 
42     
43     func(9);
44     func(10);
45        
46     return 0;
47 }

13行和41行两次释放了p,会导致程序崩溃。21行如果是奇数直接返回,也会导致问题。

运行如下:

技术分享图片

 

在哪个函数申请的内存就在哪个函数释放。

free不能释放栈上的空间,否则产生段错误。

示例程序:

 1 #include <stdio.h>
 2 #include <malloc.h>
 3 
 4 struct Demo
 5 {
 6     char* p;
 7 };
 8 
 9 int main()
10 {
11     struct Demo d1;
12     struct Demo d2;
13     
14     char i = 0;
15     
16     for(i=a; i<z; i++)
17     {
18         d1.p[i] = 0; 
19     }
20     
21     d2.p = (char*)calloc(5, sizeof(char));
22     
23     printf("%s
", d2.p);
24     
25     for(i=a; i<z; i++)
26     {
27         d2.p[i] = i; 
28     }
29     
30     free(d2.p);
31     
32     return 0;
33 }

11、12定义结构体变量时,内部的指针没有初始化。

27行会产生内存越界,i的变化范围是26,而d2.p指向的内存空间只有5个字节大小。

直接运行上述程序会产生段错误。

内存操作的交通规则:

技术分享图片

 

技术分享图片

 

技术分享图片

技术分享图片

小结:

技术分享图片

 

以上是关于第42课 内存操作经典问题分析2的主要内容,如果未能解决你的问题,请参考以下文章

第41课 内存操作经典问题分析一

第41课 内存操作经典问题分析1

python 第22课 列表 内存分析 列表常用操作

python 第22课 列表 内存分析 列表常用操作

第55课 经典问题解析

python 第17课 字符串驻留机制 内存分析 字符串同一判断 值相等判断 成员操作符 字符串常用方法汇总