目录
一、动态内存分配
1.代码分析
GetMemory里面的参数是形参,在使用完这个函数后就会被销毁,包括内存空间,p看作指向内存空间的警察指针,所以printf打印的是栈空间的地址所指向的内容,只不过这里内容可能被其它东西占了。
代码运行结果
GetMemory函数内部创建的数组是在栈区上创建的,出了函数,p数组的空间就还给了操作系统,返回的地址是没有实际意义,如果通过返回的地址去访问内存就算非法访问内存的
使用malloc开辟空间完成后要释放空间,不然会造成内存泄漏。不要进行指针的移动,因为一旦移动之后可能出现申请的空间和释放空间大小的不匹配。
使用后该指针变量一定要重新指向NULL,防止悬空指针(失效指针)出现。
2.混淆知识点
#define INT_PTR int*
typedef int* int_ptr;
INT_PTR a, b;//int* a,b,表示a是指针,整形类型,b是整形类型,不是指针
int_ptr c, d;//int* c,d 这里int*就是指针类型,c,d都是指针文件定义中,哪个变量不是指针变量?
注:
INT_PTR a, b;将被展开为int* a, b;
宏定义在编译时进行文本替换,而不考虑语法或上下文。因此,宏定义可能会导致一些意外的行为。为了避免这种混淆,推荐使用typedef语句来定义类型别名,如typedef int* int_ptr;。这样可以明确地指定int_ptr为指向整数的指针类型,并避免可能的误解。
int* f2(void)
{
int* ptr;
*ptr = 10;
return ptr;
}