【发布时间】:2021-03-05 19:32:10
【问题描述】:
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 会删除警告,但我不明白为什么。
【问题讨论】:
-
与您当前的问题无关,但您有 2 个内存泄漏,应将
C和B替换为std::vector<int> -
完整消息:
<source>(23) : warning C6386: Buffer overrun while writing to 'B': the writable size is 'size*4' bytes, but '8' bytes might be written.: Lines: 7, 9, 10, 14, 15, 16, 15, 16, 15, 18, 19, 18, 21, 22, 23live godbolt.org/z/z3h647 请记住,C6xxx 警告来自静态分析器,可能会产生误报 -
您将
A中的值用作C的索引,并将C中的值用作B的索引,但您没有显示A的值实际上看起来像开始。请提供 minimal reproducible example 显示您正在使用的输入。 -
A[i]的值是否有可能超出C[]数组的范围?在用作C[]数组的索引之前,您应该验证A[i]是否在范围内。B数组也是如此。在使用它们之前验证您的索引。
标签: c++ visual-c++ buffer buffer-overrun