GetMemory()

本文通过两个示例代码详细解析了C语言中如何正确使用指针进行内存管理。介绍了为何直接传递指针无法获得外部分配的内存地址,以及通过传递指针的地址可以解决问题的原因。同时,还讨论了野指针的问题及其解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码1:

void GetMemory(char *p)

{

 p = (char*)malloc(100);

}

int main(int argc, char *argv[])

{

 char *str = NULL;

 GetMemory(str);

 strcpy(str, "Hello");

 return 0;

}

str没有得到分配内存的地址值。
内存空间状态:首先申请了四个字节的栈空间,存放str指针,此时str的值为0,存放str的这块内存的地址值为0x0012ff7c。调用函数GetMemory,指针P入栈,也分配了四个字节的栈空间,P被赋str的值即此时P的值也为0,存放指针P的内存地址是0x0012ff2c。然后将新开辟的100个字节的内存空间地址赋给P,此时P的值为0x00372b70。函数调用结束时str的值仍为0,str并没有得到那块100个字节的内存空间地址值!

代码2:

void GetMemory(char **p)

{

 *p = (char*)malloc(100);

}

int main(int argc, char *argv[])

{

 char *str = NULL;

 GetMemory(&str);

 strcpy(str, "Hello");

 return 0;

}

str可以得到分配内存的地址值。
内存空间状态:首先申请了四个字节的栈空间,存放str指针,此时str的值为0,存放str的这块内存的地址值为0x0012ff7c。调用函数GetMemory,指针P入栈,也分配了四个字节的栈空间,此时P是一个二级指针,存放了指针str的地址值,即P的值是0x0012ff7c,存放指针P的内存空间的地址值是0x0012ff2c。然后将新开辟的100个字节的内存空间地址值0x00372b70赋给*P,即str,所以str的值为0x00372b70。函数返回时str的值为分配的100个字节的内存空间的地址!


void Test6()
{
char *str=(char *)malloc(100);
strcpy(str, "hello");
free(str);    
if(str!=NULL)  
{
strcpy(str, "world");
printf(str);
}
}

//申请空间,拷贝字符串,释放空间.前三步操作都没有任何问题.到
if 语句里的判断条件开始出错了,因为一个指针被释放之后其内容并不是NULL,
而是一个不确定的值.所以if 语句永远都不能被执行.这也是著名的"野"指
针问题.所以我们在编写程序释放一个指针之后一定要人为的将指针付成
NULL.这样就会避免出现"野"指针的出现.有人说"野"指针很可怕,会带来
意想不到的错误. http://bbs.youkuaiyun.com/topics/200069568(free的原理)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值