需要发现3个小错误-内存错误

问题描述 投票:-3回答:2

作为大学任务的一部分,我们的任务是分析一些代码,以识别内存问题。我们有3个。因为我对指针的概念还很陌生,所以我在画一个空白。我确实知道main()应该返回一个int,并且在这种情况下使用“无符号”表示非负整数。

Compiler Errors

试图搜索类似的问题。

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.
c++ out-of-memory access-violation
2个回答
0
投票

在此语句中,您仅在堆中为一个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

错误说明

  1. 看到最后一个错误和第二个错误时,将值转换为非常大的int。
  2. [如上所述,我说过其他错误,您已为1个双倍分配了内存,即8个字节,但您将其用于3个双倍(d [1],d [3],d [3]),即8 x 3 = 24字节。
  3. 剩余为返回类型,必须为int且不为void

0
投票

第一个问题是主函数的返回类型第二个在:

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.