一:常见的动态内存错误
1 对NULL指针的解引用操作
2 对动态开辟空间的越界访问
3 对非动态开辟内存使用free释放
4 使用free释放一块动态开辟内存的一部分
!: p的移动,导致了free的时候,不能够完全释放掉malloc开辟的全部内存
5 对同一块动态内存多次释放
6 动态开辟内存忘记释放(内存泄漏)
!: 动态开辟内存忘记释放(内存泄漏)(一般是在某个函数中进行开辟,然后回到主函数,无法使用开辟的空间,导致泄露)(动态申请的内存空间,不会出了作用域就自动销毁(还给操作系统),只有free,或退出程序才能还给操作系统)。
二:笔试题
第一题:
(什么都打印不出来)
1,p只是str的一份临时拷贝,无法让str改变,因为采用给的是值的传递
2,其次test里面就会对空指针进行解引用操作。
3,没有释放malloc开辟的空间,会造成内存泄露。
改进:
!:采用址传递,才能够让str改变
第二题:
(打印出的是)
1,数组的创建,出作用域会销毁这个数组的内容,str的确指向了这个数组,但是已经变成了野指针,因为指向的空间已经不属于它了。
改进:
采用malloc函数来创建这个数组,就不会因为除了GetMemory这个函数而被销毁数组的内容
第三题:
(能打印出hello,但是存在问题)
忘记在test 里面 free 掉 malloc 开辟的空间了
第四题:
(只会打印出world)
free之后,此刻str已经变成了野指针了。然后又去访问了str,非法访问
改进:
free完后,应该手动置为空即可