Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Visual studio-缓冲区溢出_C++_Arrays - Fatal编程技术网

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;