c语言实现动态内存分配——错误开辟
目录
动态内存的错误开辟
1.对null指针的解引用
2.对动态开辟空间的越界访问
3.使用free释放未动态开辟的空间
4.使用free释放动态空间的一部分
5对同一快动态开辟的空间进行多次释放
6.动态开辟的空间忘记释放- 内存泄露-严重
int main() { int *p = (int*)malloc(100000);//括号内为字节数 //未对malloc函数返回值进行判断是否为空指针,直接进行使用 int i = 0; for (i = 0; i < 10; i++) { *(p + i) = i;//均为空指针 } return 0; }
int main() { int *p = (int*)malloc(10 * sizeof(int)); if (p = NULL) { return 1; } int i = 0;//越界访问 for (i = 0; i < 40; i++) { *p++ = i; } return 0; }
int main() { int arr[10] = { 0 };//在栈区开辟 int*p = arr; free(p);//使用free释放非动态开辟的空间 p = NULL; return 9; }
int main() { int*p = (int*)malloc(10 * sizeof(int)); if (p = NULL) { return 1; } int i = 0; for (i = 0; i < 5; i++) { *p++ = i;//p最初指向0位置,后指向5位置 } free(p);//释放了5后面的空间,不符合,可使p回到最初的地址,对其进行free p = NULL; return 0; }
int main() { int*p = (int*)malloc(100); //使用.... //释放.... free(p);// p = NULL; //使用 //释放 free(p);//多次释放不符合,但可以在每次使用完free 后对其制成空指针 return 0; }
void test() { int *p = (int*)malloc(100);//只有p可以找到这个空间,离开函数时,他作为局部变量的生命周期到了,销毁 //但是p销毁了,malloc开辟的空间不会销毁, //回收的情况:1.主动释放free //2.程序结束,main函数结束, //malloc if (p = NULL) { printf("错误"); return; } //使用,忘记释放,返回,无人记得这个空间,内存泄露 } int main() { test(); //.... return 0; }
这就是动态开辟常见的一些错误
若想初步了解动态内存开辟的知识,可以翻看本人的