关于c++的一个问题,为啥下面这段代码如果不申请空间就成功不了呢?

author author     2023-04-24     722

关键词:

void Init(queue **pTop)

*pTop = (queue *)malloc(sizeof(queue)); //为甚么要申请一块空间?
(*pTop)->pTail = NULL;
(*pTop)->pTop = NULL;
(*pTop)->nCount = 0;

这就是queue指针和queue实例之间的区别,指针只是指明了可用queue实例的起始地址,这个起始地址在程序一开始是无效的,需要用户将它赋值指向一个可用的queue实例才行。而可用的queue实例需要用户自己设计程序申请出来,这就是程序中用malloc函数完成的工作。

举个例子:住房有门牌号,按照门牌号可以访问住客或者住进新客人,这个门牌号就是指针,当没有拥有住房时,门牌号是虚的,即使使用也不是你被允许访问的,需要拥有住房,并且获得门牌号才能用门牌号进行操作(访问或入住)。

参考技术A

首先pTop是二级指针,*pTop是二级指针一次解引用,仍然是指针(一级指针),指针是不能储存queue类型的值的,它只能存放queue类型的地址。

因此需要调用malloc函数申请空间,配合着申请的空间,我们才可以对这个指针进行有意义的操作:

如果指向一个基本类型,那就可以对指针解引用取值

如果指向一个对象或结构,那就可以用->进行成员访问

如果指向一个数组,那就可以用指针偏移进行取值

malloc的函数原型是:void *malloc(unsigned int size)(注意返回类型是void,意味着它可以且必须被转换成任意类型才可以使用)

下面解释一下这个过程:

malloc在内存中申请一块空间,然而要怎么访问这个空间呢?需要用一个指针指向该内存,才有可能访问,因此代码中的*pTop(你所定义的pTop是一个二级指针,所以*pTop是一级指针,因此用*pTop指向分配的内存没有问题)就是这样一个用法。

但是有了指针还不够,应该怎样去读写空间中的数据呢?是作为int,char?或者是更复杂的类型(比如你程序中的queue类型),因此你必须强制转换为特定的类型(就如你代码中的“(queue*)”强制类型转换),才能知道告诉编译器按照什么类型来读写这个空间(每个类型的读写方式都是不一样的)

所以*pTop = (queue *)malloc(sizeof(queue));的解释其实分为以上3个步骤:分配空间,强制转换空间的类型(告诉编译器该以何种形式处理),使指针指向空间(以得访问)

==========

另外,C++中建议用new和delete代替malloc和free

malloc和new都是申请一块内存空间并使指针指向空间,但是new会调用类的构造函数,可以初始化某些类的成员(有时这是必要的),而malloc只是单纯分配空间和指针赋值,而不会进行任何额外操作。free和delete也是同理(delete调用析构函数

另外new和delete不需要头文件,直接可以使用,比较方便

但是new和delete确实会比malloc和free效率低一丢丢,但是随着硬件的发展,这一丢丢已经是可以完全忽略不计的了。所以还是建议new和delete

本回答被提问者采纳
参考技术B 关于C++的一个问题,为什么下面这段代码如果不申请空间就成功不了呢?

或者是无效的 C++:为啥这段代码会编译?

...】:2010-11-2820:01:07【问题描述】:这是我用QtCreator制作的一个非常简单的C++应用程序:intmain(intargc,char*argv[])inta=1;intb=2;if(a<1orb>3)return1;r 查看详情

C++ 无法理解为啥这段代码不是线程安全的

...这段代码不是线程安全的【发布时间】:2015-10-0809:35:35【问题描述】:已经在一些OpenCV函数上创建了C++包装器并将其导出到PInvoke,可以并行调用它。说实话:voidexecute(Document&d)ScriptConfigconf(d 查看详情

为啥打字稿允许我覆盖一个空的状态对象?

】为啥打字稿允许我覆盖一个空的状态对象?【英文标题】:Whydoestypescriptallowmetooverrideanemptystateobject?为什么打字稿允许我覆盖一个空的状态对象?【发布时间】:2019-07-1408:34:30【问题描述】:我将这段代码读作将状态定义为空... 查看详情

为啥这段代码会给出“可能的空引用返回”编译器警告?

...引用返回”编译器警告?【发布时间】:2020-04-0523:20:38【问题描述】:考虑以下代码:usingSystem;#nullableenablenamespaceDemopublics 查看详情

我不知道为啥我不能在 C++ 中初始化一个数组的数组

】我不知道为啥我不能在C++中初始化一个数组的数组【英文标题】:Idon\'tknowwhyIcan\'tinitializeanarrayofanarrayinC++我不知道为什么我不能在C++中初始化一个数组的数组【发布时间】:2021-08-1821:21:37【问题描述】:我有这段C++代码:std::... 查看详情

为啥这段代码不打印我的数组?

...【发布时间】:2011-08-1518:11:15【问题描述】:我在这里有一个整数数组排序程序,但我遇到了一个问题:每当我运行该程序时,我有时会收到“变量\'numbers\'周围的堆栈已损坏”消息,有时它只是重复打印出数字8。这是我的代码... 查看详情

为啥我在 C++ 中有一个空指针取消引用?

】为啥我在C++中有一个空指针取消引用?【英文标题】:WhydoIhaveanullpointerdereferenceinC++?为什么我在C++中有一个空指针取消引用?【发布时间】:2018-09-2808:29:09【问题描述】:我在Eclipse中获得了一个空指针取消引用,但我不知道... 查看详情

为啥下面我写的这段代码老是提示"不允许使用不完整类型"

...面的结构体而已,用new分配空间是不合理的。既然定义了一个指针,可以:structtrainF...myTrain;node*head=&nyTrain;或者你直接structtrainFmyTrain;structtrainFhead=&myTrain;你traningFvstrainingF,是什么鬼,敲代码要认真点。本回答被提问者和网友采纳... 查看详情

C++ - 为啥在没有明显的构造函数匹配时编译这段代码?

...数匹配时编译这段代码?【发布时间】:2014-09-2511:35:15【问题描述】:请考虑以下代码:classFoopublic:explicitFoo(double);Foo*test();Foo*test( 查看详情

为啥 C++ 映射类型参数在使用 [] 时需要一个空的构造函数?

】为啥C++映射类型参数在使用[]时需要一个空的构造函数?【英文标题】:WhydoestheC++maptypeargumentrequireanemptyconstructorwhenusing[]?为什么C++映射类型参数在使用[]时需要一个空的构造函数?【发布时间】:2009-03-2923:49:59【问题描述】:... 查看详情

为啥 C++ 程序输出这个值?

...为什么这段代码的输出是8。我推断*b+x等于数组a+x*4的第一个元素,但我不知道为什么。有人可以详细说明吗?#include<iostream>usingnamespacestd;intmain()inta[2][3 查看详情

为啥需要空终止符?

...我知道这是必要的,但我想我只是从根本上不明白为什么一个字符串不会只以最后一个字符结尾。【问题讨论】:你怎么知道最后一个字符是什么?你需要一个同意的 查看详情

c++问题:关于匿名命名空间

匿名命名空间有什么用?怎样才能使用匿名命名空间里的标识符?主要是为了团体使用时的重名问题.我们举例说明,假如你找一个学校找小明这个人.那么这个叫小明的人可能有好几个,如果你可以确定小明在3班,那么就可以排除掉... 查看详情

为啥这段代码不能在 Visual Studio 2010 中编译和运行?

...通的旧ANSI编译,而不需要任何类型的Microsoft扩展。我从一个空的项 查看详情

为啥不继承 C++ 构造函数?

...什么不继承C++构造函数?【发布时间】:2011-07-1516:27:11【问题描述】:为什么在这段代码中需要Child传递构造函数?我认为它不会,但是当我删除它时编译器(gcc和VS2010)会抱怨。有没有优雅的解决方法?将这个shim插入到子类中... 查看详情

这段代码是在创建一个类对象吗?如果是这样,为啥要以这种方式使用它

】这段代码是在创建一个类对象吗?如果是这样,为啥要以这种方式使用它【英文标题】:Isthispieceofcodecreatingaclassobject?Ifthatsowhyusingitthisway这段代码是在创建一个类对象吗?如果是这样,为什么要以这种方式使用它【发布时间】... 查看详情

关于日期的 C++ 不完整代码,更好的解决方案是啥?

】关于日期的C++不完整代码,更好的解决方案是啥?【英文标题】:C++IncompleteCodeaboutdates,whatisthebettersolution?关于日期的C++不完整代码,更好的解决方案是什么?【发布时间】:2013-05-1613:39:20【问题描述】:我正在编写一个代码... 查看详情

为啥我的程序使用 sqldf 返回空数据框

...序使用sqldf返回空数据框【发布时间】:2021-10-0413:08:56【问题描述】:以下代码返回空数据框。使用case语句的原因是:如果stat_genius和stat_npps之间的stat_id_cd不匹配,则使用分隔符填充。以下代码适用于单行,但不能用于多行。下... 查看详情