作为大学任务的一部分,我们的任务是分析一些代码,以识别内存问题。我们有3个。因为我对指针的概念还很陌生,所以我在画一个空白。我确实知道main()应该返回一个int,并且在这种情况下使用“无符号”表示非负整数。
试图搜索类似的问题。
void main()
{
double* d = new double;
for (unsigned int i = 0; i < 3; i++) {
d[i] = 1.5 + i;
}
for (unsigned int i = 2; i >= 0; i--) {
cout << d[i] << endl;
}
}
The program results in an infinite loop of memory addresses.
在此语句中,您仅在堆中为一个double变量创建内存。如果您需要3。然后,您必须为3个变量分配内存,例如。
double* d = new double[3];
并且原因循环是无限的,因为在第二个循环中,由于变量是无符号的,因此i的值将变为-1时,它将转换为非常大的正数,具体取决于您的机器,就像我的机器一样它被转换为4294967295。
unsigned int i = -1;
cout<<i; //try running this code and you will see value of i to be 4294967295
错误说明
第一个问题是主函数的返回类型第二个在:
double* d = new double;
您正在为一双分配内存,但是在循环中,您正在访问3个索引最后
for (unsigned int i = 2; i >= 0; i--)
无符号类型不能容纳负值,因此在它变为零后,它又再次上升到最大无符号int(x ^ 32)-1,并且您再次访问超出范围的位置
所以您的代码应如下所示:
#include <iostream>
int main()
{
double* d = new double[3];
for (unsigned int i = 0; i < 3; i++) {
d[i] = 1.5 + i;
}
for ( int i = 2; i >= 0; i--) {
std::cout << d[i] << std::endl;
}
delete[] d;
return 0;
}