gpt4 book ai didi

c++ - Visual Studio - 缓冲区溢出

转载 作者:行者123 更新时间:2023-12-03 07:22:32 29 4
gpt4 key购买 nike

有这个代码:

#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];
}
而对于
lengths[i] = abs_length(coordinates[i]);
我收到警告(最终出现 fatal error ):
Buffer overrun while writing to 'lengths': the writable size is '1*8' bytes, but '16' bytes might be writen.
我不明白。为什么可以写入 16 个字节,当 double大小是 8 吗? 16 是地址,但是 abs_length正在返回 double ,没有指针。那么bug在哪里呢?

最佳答案

这里有错误

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;
创建 本地 数组并存储指向该数组的指针。当您退出 for 循环的主体时,该数组被销毁,因此您正在存储一个指向已被销毁的对象的指针。
这段代码可以工作
        int* vector = new int[2];
vector[0] = x;
vector[1] = y;
ar2[i] = vector;
可能还有其他错误,代码中的指针太多。

关于c++ - Visual Studio - 缓冲区溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64676646/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com