C语言动态内存分配及常见混淆练习

目录

一、动态内存分配

1.代码分析

 2.混淆知识点


一、动态内存分配

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;
}

//出错,函数*ptr没有经过初始化,是野指针,都不知道指向哪,因此不能赋值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值