需要找出 3 个小错误——内存错误
Need to find 3 small errors - memory bugs
作为大学作业的一部分,我们的任务是分析一些代码以找出内存问题。我们要找到 3 个。由于我对指针的概念很陌生,所以我画了一个空白。我知道 main() 应该返回一个 int 并且在这种情况下使用 "unsigned" 意味着非负整数。
尝试搜索类似的问题。
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
错误解释
- 看到你的第 3 个和第 2 个最后一个错误说同样的值被转换为非常大的 int。
- 其他错误如我上面所解释的那样,您已经为 1 个双精度分配了内存,即 8 字节,但您正在将其用于 3 个双精度 (d[1],d[3],d[3]),即 8 x 3 = 24 字节。
- 剩下的是 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;
}
作为大学作业的一部分,我们的任务是分析一些代码以找出内存问题。我们要找到 3 个。由于我对指针的概念很陌生,所以我画了一个空白。我知道 main() 应该返回一个 int 并且在这种情况下使用 "unsigned" 意味着非负整数。
尝试搜索类似的问题。
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
错误解释
- 看到你的第 3 个和第 2 个最后一个错误说同样的值被转换为非常大的 int。
- 其他错误如我上面所解释的那样,您已经为 1 个双精度分配了内存,即 8 字节,但您正在将其用于 3 个双精度 (d[1],d[3],d[3]),即 8 x 3 = 24 字节。
- 剩下的是 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;
}