我嘗試在C中實現合併排序,當我遇到由Visual Studio 2015中的[分析 - >運行代碼分析]引發的一些有趣問題時。VS2015:[C6386]寫入時緩衝區溢出(即使對於相同的索引值)
的代碼如下:
void MergeSort_r(int A[], int n)
{
// A = {1, 3, 2}
// n = 3
int rightCount;
int* R;
if (n < 2) return;
// version 1: rightCount = 2
rightCount = n - (n/2);
// version 2: rightCount = 2
rightCount = n - 1;
R = (int*) malloc(rightCount * sizeof(int));
if (R) {
for (int i = 0; i < rightCount; i++) {
R[i] = A[i];
}
free(R);
}
}
儘管兩個版本rightCount基本上計算爲2,在第一個版本,我得到警告:
"Buffer overrun while writing to 'R': the writable size is '(unsigned int)rightCount*sizeof(int)' bytes, but '8' bytes might be written."
任何想法,爲什麼日是這樣嗎?期待聽到你的答案。
[請參閱此討論,爲什麼不在'C'中投射'malloc()'和家族的返回值。](http://stackoverflow.com/q/605845/2173917)。 –
@Sourav:在c + +(這是在VS中的默認值),你必須。 – MikeMB
@MikeMB是不是像我們有C編譯器來編譯C代碼?無論如何,我們應該使用它。順便說一句,這只是一個內容豐富的評論。 –