intmain() { int *p = (int*)malloc(100000);//括号内为字节数 //未对malloc函数返回值进行判断是否为空指针,直接进行使用 int i = 0; for (i = 0; i < 10; i++) { *(p + i) = i;//均为空指针 } return0; }
2.对动态开辟空间的越界访问
malloc中一个有40个字节的空间
但循环语句中进行了160个字节超过范围
越界访问不合理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
intmain() { int *p = (int*)malloc(10 * sizeof(int)); if (p = NULL) { return1; } int i = 0;//越界访问
for (i = 0; i < 40; i++) { *p++ = i; }
return0; }
3.使用free释放未动态开辟的空间
使用时搞混了,只有malloc,calloc,realloc在堆区开辟的空间才可以用free释放,
而arr在栈区开辟的非动态空间不可以用free释放
1 2 3 4 5 6 7 8
intmain() { int arr[10] = { 0 };//在栈区开辟 int*p = arr; free(p);//使用free释放非动态开辟的空间 p = NULL; return9; }
4.使用free释放动态空间的一部分
free释放的应从开辟空间起始地址进行释放
而不能是空间中的地址
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
intmain() { int*p = (int*)malloc(10 * sizeof(int)); if (p = NULL) { return1; } int i = 0; for (i = 0; i < 5; i++) { *p++ = i;//p最初指向0位置,后指向5位置 } free(p);//释放了5后面的空间,不符合,可使p回到最初的地址,对其进行free p = NULL; return0; }