-
对NULL指针的解引用操作
void test() { int* p = (int*)malloc(INT_MAX); *p = 20; // 如果p的值是NULL,这里就会有问题 // 所以说,我们在进行开辟空间的时候,一定要对返回值进行判断,防止出现NULL的情况。 free(p); }
-
对动态开辟空间的越界访问
void test() { int i = 0; int *p = (int*) malloc(10*sizeof(int)); if (NULL == p) { exit(EXIT_FAILURE); } for (i = 0; i <= 20; i++) { *(p + i) = i; // 当 i 是10的时候,越界访问 } free(p); p = NULL; }
-
对非动态开辟内存使用free释放
void test() { int a = 10; int* p = &a; free(p); // 是不可以的 p = NULL; }
-
使用 free 释放一块动态开辟内存的一部分
void test() { int* p = (int*)malloc(100); p++; free(p); // p其实在这里已经不再指向动态内存的其实位置 }
所以,在使用时,最好使用
起始地址+下标
的方式,而不要使用自增自减*(p + i)
-
对同一块动态内存多次释放
void test() { int* p = (int *)malloc(100); free(p); free(p); // 重复释放 }
所以,我们在使用动态内存时,要保证
- 谁申请,谁回收
free
完之后记得变成NULL
,就不会出问题了。
-
动态开辟内存忘记释放(内存泄漏)
void test() { int* p = (int *)malloc(100); if(NULL != p) { *p = 20; } } int main() { test(); while(1) { test(); } }
20、C语言常见的动态内存错误
最新推荐文章于 2024-07-21 23:17:36 发布