C++ Visual studio-缓冲区溢出
有此代码:C++ Visual studio-缓冲区溢出,c++,arrays,C++,Arrays,有此代码: #include <iostream> #include <math.h> #include <algorithm> double abs_length(int * ar) { return ( sqrt(pow(double(ar[0]), 2) + pow(double(ar[1]), 2)) ); } int ** correction(int size, int(*ar)[2], int ref
#include <iostream>
#include <math.h>
#include <algorithm>
double abs_length(int * ar)
{
return (
sqrt(pow(double(ar[0]), 2) + pow(double(ar[1]), 2))
);
}
int ** correction(int size, int(*ar)[2], int refX, int refY)
{
int **ar2 = new int*[2];
for (int i = 0; i < size; i++)
{
int x = abs(ar[i][0] - refX);
int y = abs(ar[i][1] - refY);
int vector[2] = { x,y };
ar2[i] = vector;
}
return ar2;
}
double median(int size, int(*ar)[2], int refX, int refY)
{
int **coordinates = correction(size, ar, refX, refY);
double* lengths = new double(size);
for (int i = 0; i < size; i++)
{
lengths[i] = abs_length(coordinates[i]);
}
sort(lengths, lengths + size);
return size % 2 == 0 ? (lengths[(size / 2) - 1] + lengths[size]) / 2 :
lengths[(size / 2) - 1];
}
我收到警告(最终导致致命错误):
我不明白。当double
的大小为8时,为什么可以写入16个字节?16是地址,但abs_length
返回的是双精度,没有指针。那么bug在哪里呢?您输入了一个错误:
new double(size)
为具有值size
的单个double分配空间
你可能是说:
new double[size]
它为大小为双倍的数组分配空间。这里有一个错误
int ** correction(int size, int(*ar)[2], int refX, int refY)
{
int **ar2 = new int*[2];
for (int i = 0; i < size; i++)
{
int x = abs(ar[i][0] - refX);
int y = abs(ar[i][1] - refY);
int vector[2] = { x,y };
ar2[i] = vector;
}
return ar2;
}
创建一个本地数组并存储指向该数组的指针。当您退出for循环体时,数组将被销毁,因此您正在存储指向已销毁对象的指针
这个代码可以工作
int* vector = new int[2];
vector[0] = x;
vector[1] = y;
ar2[i] = vector;
可能还有其他错误,代码中的指针太多。天哪,这是一些糟糕的代码。帮自己一个忙——声明一个包含x和y元素的结构,并使用它来代替这两个元素数组。你的int(*uu)[2]是你困惑的根源。
double*length=新的double(size)代码>为值为size
的1
double创建一个内存位置。您可能需要double*length=新的double[size]代码>。您还可以在退出时泄漏长度
和坐标
。为什么不直接使用std::vector
让编译器为您管理内存呢?@Sneftel这很糟糕。我不会自己写的。这正是我的大学要求也许,你的大学课程不好:;-)我纠正了。但是仍然得到同样的错误(溢出),仍然是关于写入长度的错误?我觉得很难相信。尽管函数末尾的length[size]
是无效的读取访问,但如何修复它?@milanHrabos请参阅编辑,您需要分配内存。
int ** correction(int size, int(*ar)[2], int refX, int refY)
{
int **ar2 = new int*[2];
for (int i = 0; i < size; i++)
{
int x = abs(ar[i][0] - refX);
int y = abs(ar[i][1] - refY);
int vector[2] = { x,y };
ar2[i] = vector;
}
return ar2;
}
int vector[2] = { x,y };
ar2[i] = vector;
int* vector = new int[2];
vector[0] = x;
vector[1] = y;
ar2[i] = vector;