使用Visual Studio,我遇到了一个int类型变量和一个float类型变量的问题。它们都存储在自己的数组中。当我把它们打印出来时,它们作为记忆位置出现了胡言乱语。当我调试时,我发现在监视区域的内存乱码旁边会显示正确的值。我还注意到在类型下,变量类型旁边有一个*(星号)。有人可以提供有关为什么会发生这种情况的信息吗?提前谢谢。
观看区域看起来像这样......
名称值类型
得分0x002ff5c8 {96.0000000}浮动*
studentID 0x002ff698 {9317} int *
答案 0 :(得分:1)
我建议阅读上面的教程,也许是一本入门书,取决于你对学习c ++的兴趣。该类型是int和float数据的指针类型。这是一个回答问题的小例子(如何打印出这些值):
float* a = new float(5.8);
指针建立,指向存储值为5.8的浮点数的存储位置。
std::cout << *a;
a之前的星号被称为取消引用指针,这是数据的访问方式,您可能需要检查以确保您有一个有效的指针或您的程序可能崩溃。
delete a;
删除不再使用时分配的内存(编辑2),这将释放存储空间(不这样做会导致内存泄漏)
编辑1: 考虑指针可能指向浮点数或int的连续数组(这比一个更可能),然后您必须知道您正在读取的数组的大小以访问元素。在这种情况下,您将使用operator []访问成员,假设我们有一个数组b,
float* b = new float[2] {0.0,1.0};
要打印它的成员,您必须访问每个元素
std::cout << b[0] << ' ' << b[1];
对于数组
,delete运算符如下所示delete[] b;
编辑2: 每当您使用new来动态分配内存时,请考虑变量的范围,当范围结束时删除指针。用户是正确的,您不想删除稍后可能使用的指针,也不需要调用删除从引用中获取的指针。
答案 1 :(得分:0)
首先,您正在使用调试器。这太棒了。使用调试器可以在五分钟内解决的SO问题数量惊人。你已经远远超过了游戏,而不是浪费时间的许多令人讨厌的麻烦,他们无法使用编译器附带的咒骂删除工具。
其次,一些重要的阅读因为它解释了正在发生的事情的一部分:What is array decaying?
现在分解调试器向您显示的内容
得分0x002ff5c8 {96.0000000}浮动*
得分:显然是变量的名称
浮动* :score
是float *
类型的变量,a pointer为float
。
0x002ff5c8 :这是score
的数据值。指针是对内存中位置的引用。他们不是数据,而是指向数据。所以指针是一个变量,它包含在哪里找到另一个变量的地址。 002ff5c8是内存中的十六进制位置,您可以在其中找到score
指向的内容。
{96.0000000} :score
指向已设置为96的浮点值(possibly plus or minus some fuzziness because not all numbers can be exactly represented with floating point)
所以疯狂的数字0x002ff5c8告诉程序在哪里找到score
的数据,这个数据恰好是96.
请注意,调试器仅向您显示score
数据数组中的第一个值,这会将我们带回数组衰减。程序知道score
指向多少数据的可能性很大。可以是一个float
。可能是一百万。一旦阵列衰减,你必须携带一个数组块的长度。