第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的主要内容,如果未能解决你的问题,请参考以下文章