4、指针参数是如何传递内存的?
如果函数的参数是一个指针,不要指望用该指针去申请动态内存。示例7-4-1中,Test函数的语句GetMemory(str, 200)并没有使str获得期望的内存,str依旧是NULL,为什么?
void GetMemory(char *p, int num)
{
p = (char *)malloc(sizeof(char) * num);
}
void Test(void)
{
char *str = NULL;
GetMemory(str, 100); // str 仍然为 NULL
strcpy(str, "hello"); // 运行错误
}
示例4.1 试图用指针参数申请动态内存
毛病出在函数GetMemory中。编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是 _p,编译器使 _p = p。如果函数体内的程序修改了_p的内容,就导致参数p的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中,_p申请了新的内存,只是把 _p所指的内存地址改变了,但是p丝毫未变。所以函数GetMemory并不能输出任何东西。事实上,每执行一次GetMemory就会泄露一块内存,因为没有用free释放内存。
如果非得要用指针参数去申请内存,那么应该改用“指向指针的指针”,见示例4.2。
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(sizeof(char) * num);
}
void Test2(void)
{
char *str = NULL;
GetMemory2(&str, 100); // 注意参数是 &str,而不是str
strcpy(str, "hello");
cout<< str << endl;
free(str);
}
示例4.2用指向指针的指针申请动态内存
由于“指向指针的指针”这个概念不容易理解,我们可以用函数返回值来传递动态内存。这种方法更加简单,见示例4.3。
char *GetMemory3(int num)
{
char *p = (char *)malloc(sizeof(char) * num);
return p;
}
void Test3(void)
{
char *str = NULL;
str = GetMemory3(100);
strcpy(str, "hello");
cout<< str << endl;
free(str);
}
分享到:
相关推荐
1. **并发标记阶段**:G1使用并发标记清除算法,能在应用线程运行的同时进行垃圾收集,减少停顿时间。 2. ** Region划分**:通过Region划分,使得GC可以更灵活地进行局部或全局的垃圾回收。 3. **暂停预测**:G1能够...
《股权代持问题及解决方式》 ...理解并妥善处理股权代持问题,是企业稳健经营的重要环节。对于涉及股权代持的企业和个人来说,充分了解相关法律法规,制定严谨的协议,并在必要时寻求专业法律咨询,至关重要。
本文将详细探讨“昂达H110刷8代9代u软件及教程”这一主题,帮助用户理解如何通过这个过程升级他们的主板以支持新一代的Intel处理器。 标题中的“昂达H110刷8代9代u”指的是使用特定的软件工具对昂达H110主板的BIOS...
这份操作说明旨在帮助上市公司理解并掌握股息申报的具体流程,以确保税务合规,避免因信息收集不全而引发的潜在问题。 首先,我们需要进行的是**单位信息设置**。在个人所得税代扣代缴系统中,第一步是登录并进入...
1. **网络编程基础**:熟悉Java的Socket编程是首要的,因为HTTP通信基于TCP/IP协议,我们需要使用Socket来建立客户端和服务器之间的连接。`java.net.Socket`和`java.net.ServerSocket`类是核心工具。 2. **HTTP协议...
1. **样本量问题**:早期临床试验中,由于安全性考虑,样本量往往较小,这给比例化剂量反应关系的研究带来了挑战。 2. **非线性特征**:几乎所有药物在极高剂量下都会表现出非线性特征,这意味着即使在低剂量下表现...
Java是世界上最流行的编程语言之一,尤其在企业级应用开发中占据主导地位。...在阅读"java六大必须理解的问题-来自网络少许有误.txt"文档时,应注意其中的错误并结合其他权威资料进行校对,以获取最准确的知识。
首先,我们要理解什么是IP代理服务器。IP代理服务器是一种网络服务,它作为用户和互联网之间的中介,通过代理服务器提供的IP地址进行网络访问。这样做的好处在于可以隐藏用户的原始IP地址,提高匿名性,同时也可以...
在电力系统分析中,潮流计算是一项基础且重要的任务,它用于确定电力网络中各节点电压、功率分布等电气参数。...通过实践这一过程,我们可以深入理解电力网络的运行特性,掌握解决复杂电力系统问题的工具和技术。
1. **阅读理解型问题**:在中考中,阅读理解型问题是近年来频繁出现的题型,它要求考生阅读一段材料后,根据所获取的信息解答问题。这类问题通常涉及新数学概念的形成、公式的推导与应用,或是结合实际背景的数学...
《XXXX年债权人代位权制度的理解与适用》 债权人代位权制度,是现代法律体系中为保护债权人权益,防止债务人逃避债务而设立的重要法律工具。这一制度源自早期的司法实践,具体体现在《关于适用民事诉讼法若干问题的...
在Java世界中,面向切面编程...理解并掌握这两种代理方式,对于深入理解和有效利用Spring AOP至关重要。在实际开发中,根据业务需求和性能考虑,选择合适的动态代理方式,可以有效地提高代码的可维护性和扩展性。
股权代持涉及到法律风险、税务问题、权益保障等多个方面,对于企业和个人投资者来说,理解其核心概念、法律关系以及解决方式至关重要。 股权代持,又称委托持股或隐名投资,是指实际出资人(隐名股东)不直接登记为...
0-1背包问题是一种经典的组合优化问题,在计算机科学和运筹学中有着广泛的...通过学习和理解这个案例,你可以掌握如何应用遗传算法来解决实际的多目标优化问题,这对于优化问题的求解和算法设计具有很高的实践价值。
1. **授权管理**:允许管理员对锁进行写操作,如导入、导出或更新授权信息。 2. **锁状态检查**:检查锁的当前状态,包括剩余使用次数、有效期限等。 3. **故障排查**:诊断锁的问题,如检测锁是否损坏或存在软件...
将100个数分成50组,计算每个组的两个数代入表达式后的和的最大值,这涉及到组合优化和求和问题,需要考虑如何最大化绝对差的和。 9. 取整函数的性质与应用 [x]、(x)和分别代表下取整、上取整和最接近x的整数,这些...
1. **剧情概述**:介绍游戏的基本背景和主要人物,让玩家对游戏的世界观有一个大致的了解,包括智代的角色设定、性格特点以及与其他角色的关系。 2. **角色攻略**:针对每个可互动的角色,提供详细的攻略建议,包括...
通过阅读《代数学引论》(第二版),读者不仅可以掌握代数学的基础理论,还能了解到这些理论在解决实际问题中的应用,如密码学、编码理论、量子计算等领域。书中的例题和习题设计精心,有助于读者加深对理论的理解和...
总的来说,VB银行代扣代发工资系统是一个结合了银行业务流程、数据库管理和软件工程的综合性项目,它展示了VB在实际业务场景中的应用,对于学习者提升编程技能和业务理解大有裨益。通过分析和学习这个系统,不仅可以...