C指针动态内容分配

指针动态内容分配.

在做实验的时候,到二叉树的先序遍历建立二叉树的时候,参照着严蔚敏老奶奶的《数据结构C语言版》第131的如下代码

很多情况下,当传递指针的时候,都是传递指针本身,而如果这里把BiTree &T改成

BiTree T时(BiTree为指针类型),程序就会崩溃。(在这里鄙视自己一下,当一个学生问我这个问题的时候,我居然还和他说,这里用指针和用指针的引用都可以的时候。。。。)

发现传递指针和传递指针的引用有着很大的区别。

例如如果要在主函数定义一个int型指针,然后在函数中将该指针动态分配空间,此时应该传递的是指针的引用,而不是指针本身。

发现程序崩溃。

而采用下面的函数赋值则没有问题

为什么会有上面的原因呢?

下面给出解释。

当我们在主函数里声明一个int型的指针a的时候,系统会取用下面一个结构

其中a是一个指针变量,v代表的是变量a的值,即某个地址,当没有初始化的时候,v是个指向未知区域的值,可能是应用程序地址也可能是系统程序的地址,因此不能直接输出没有初始化指针的值,会造成程序崩溃。

当我们把指针a当做变量传递的时候,会有下面一个分配关系

这时候函数会产生一个形式参数,形式参数就是实参的一个副本。简单来说,就是拷贝一个一模一样的同样内容的变量。在这里会产生一个副本a’,其中a’的地址和a是不同的,但是里面存放的内容是相同的,这也就是为什么很多地方采用指针传值就是对同一个位置上的内容进行操作。

当在函数中进行动态地址分配的时候,即

也就是改变了形参a’的值,变为了v’,其中v’指向堆中动态申请的一个内容为5的变量地址。

而这些操作都没有改变实参中a的值,因此a的内容没有变,还是指向一个未知区域,而当函数返回后,a’的值被释放,产生了堆中的内存泄露。

而在采用引用赋值后,相当于传递的是指针本身,因此所有的操作即是对指针a本身的操作,没有问题。

因此该注意在函数里对主函数的指针进行动态空间分配!

点击查看更多

版权归www.itbuluoge.com所有  转载请注明出处



-----------------------------------PS----------------------------------

为了证明我的结论没有错误

我测试了以下程序:

#include "stdafx.h"


void seta(int * p)
{
	p=new int(5);
}
int main(int argc, char* argv[])
{
	int* a=new int(7);
	//经过动态申请空间后,输出a指向的值
	seta(a);


	printf("%d",*a);
	return 0;
}

输出7,说明正常。因此这里的函数压根就没有对a有过任何的影响,不存在着二楼的说法~~~



本结论我分别询问了中科大计算机12级硕士群,C/C++爱好者群,某腾讯开发经理等专业人士,有问题请留言继续探讨~

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要明白什么是指针,必须先要弄清楚数据在内存中是如何存储的,又是如何被读取的。 如果在程序中定义了一个变量,在对程序进行编译时,系统就会为这个变量分配内存单元。编译系统根据程序中定义的变量类型分配一定长度的空间。内存的基本单元是字节,一字节有8位。每字节都有一个编号,这个编号就是“地址”,它相当于旅馆的房间号。在地址所标示的内存单元中存放的数据,就相当于在该旅馆房间中居住的旅客。 大家一定要弄清楚“内存单元的地址”和“内存单元的内容”这两个概念的区别,即“房间号”和“房间内所住客人”的区别。在程序中一般是通过变量名来对内存单元进行存取操作的。其实程序经过编译以后已经将变量名转换为变量的地址,对变量值的存取都是通过地址进行的。这种按变量地址存取变量的方式称为直接访问方式。 还有一种间接访问的方式,即变量中存放的是另一个变量的地址。也就是说,变量中存放的不是数据,而是数据的地址。就跟寻宝一样,可能你按藏宝图千辛万苦找到的宝藏不是金银珠宝,而是另一张藏宝图。按C语言的规定,可以在程序中定义整型变量、实型变量、字符型变量,也可以定义这样一种特殊的变量,它是存放地址的。 由于通过地址能找到所需的变量单元,所以可以说,地址“指向”该变量单元。如同一个房间号指向某一个房间一样,只要告诉房间号就能找到房间的位置。因此在C语言中,将地址形象地称为“指针”,意思就是通过它能找到以它为地址的内存单元。 所以,一个变量的地址就称为该变量的指针指针就是地址,而地址就是内存单元的编号。它是一个从零开始的、操作受限的非负整数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值