簡體   English   中英

Visual Studio - 緩沖區溢出

[英]Visual studio - buffer overrun

有這個代碼:

#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]);

我收到警告(最終出現致命錯誤):

Buffer overrun while writing to 'lengths': the writable size is '1*8' bytes, but '16' bytes might be writen.

我不明白。 double的 sizeof 8 時,為什么可以寫入 16 個字節? 16 是地址,但abs_length返回雙abs_length值,沒有指針。 那么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;

可能還有其他錯誤,代碼中的指針太多。

你打錯了:

new double(size)

為值為size的單個雙精度分配空間。

你可能的意思是:

new double[size]

它為size翻倍的數組分配空間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM