需要找出 3 个小错误——内存错误

Need to find 3 small errors - memory bugs

作为大学作业的一部分,我们的任务是分析一些代码以找出内存问题。我们要找到 3 个。由于我对指针的概念很陌生,所以我画了一个空白。我知道 main() 应该返回一个 int 并且在这种情况下使用 "unsigned" 意味着非负整数。

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.

在此语句中,您仅为一个双精度变量在堆中创建内存。如果你需要 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. 看到你的第 3 个和第 2 个最后一个错误说同样的值被转换为非常大的 int。
  2. 其他错误如我上面所解释的那样,您已经为 1 个双精度分配了内存,即 8 字节,但您正在将其用于 3 个双精度 (d[1],d[3],d[3]),即 8 x 3 = 24 字节。
  3. 剩下的是 return 类型,必须是 int 而不是 void

第一个问题是main函数的return类型 第二个在:

double* d = new double;

您正在为一个 double 分配内存,但在您的循环中,您正在访问 3 个索引 最后

 for (unsigned int i = 2; i >= 0; i--) 

unsigned 类型不能保持负值,因此在它变为零后再次上升到 max unsigned 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;
}