第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\n", 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\n", 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\n", 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个字节大小。

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

内存操作的交通规则:

小结:

猜你喜欢

转载自www.cnblogs.com/wanmeishenghuo/p/9557448.html
今日推荐