簡體   English   中英

VS2019:[C6386] 緩沖區溢出而到

[英]VS2019: [C6386] Buffer Overrun while to

void Counting_Sort(vector<int>& A)
{
const int size = A.size();

int max = A[0];
for (int i = 1; i < size; i++)
    if (max > A[i])
        max = A[i];

int* C = new int[max + 1]{ 0 };
for (int i = 0; i < max + 1; i++)
    C[A[i]] = C[A[i]] + 1;

for (int i = 1; i < max + 1; i++)
    C[i] = C[i] + C[i - 1];

int* B = new int[size];
for (int i = size-1; i >= 0; i--)
    B[C[A[i]] - 1] = A[i];   // <-- Warning here

}

我不太確定為什么會收到警告或它的確切含義。 將 for 循環中的 size-1 設置為 size-2 會刪除警告,但我不明白為什么。

我注意到您的示例代碼有四個不同的問題:

  1. 最大值的計算不正確。 您的情況應該是測試if (A[i] > max)
  2. 計數排序算法的“累積步驟”應該迭代輸入數據。 也就是說,循環應該如下(最多為size ,而不是最多max + 1 ):
for (int i = 0; i < size; i++)
    C[A[i]] = C[A[i]] + 1;
  1. 算法的最終循環忘記更新每個“計數排序箱”的目的地。 也就是說,最終的循環應該如下:
for (int i = size - 1; i >= 0; i--) {
    B[C[A[i]] - 1] = A[i];
    C[A[i]] = C[A[i]] - 1;
}
  1. 完成后不要忘記在BC上使用delete[]

這是完全編輯的結果:

#include <iostream>
#include <vector>

void Counting_Sort(std::vector<int>& A) {
    const int size = A.size();

    int max = A[0];
    for (int i = 1; i < size; i++)
        if (A[i] > max)
            max = A[i];

    int* C = new int[max + 1]{ 0 };
    for (int i = 0; i < size; i++)
        C[A[i]] = C[A[i]] + 1;

    for (int i = 1; i < max + 1; i++)
        C[i] = C[i] + C[i - 1];

    int* B = new int[size];
    for (int i = size-1; i >= 0; i--) {
        B[C[A[i]] - 1] = A[i];
        C[A[i]] = C[A[i]] - 1;
    }

    for (int i = 0; i < size; i++)
        std::cout << "B[" << i << "] is " << B[i] << "\n";

    delete[] B;
    delete[] C;
}

int main() {
    std::vector<int> A = {6, 1, 3, 3, 6, 9};
    Counting_Sort(A);
    return 0;
}

編譯器說 B 的大小是 4xsize 字節長,但在某些情況下,可能會寫入 8 個字節,這可能會超過 4xsize 字節的長度。

以 A = {10} 為例。

暫無
暫無

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

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