【发布时间】:2016-05-13 08:37:04
【问题描述】:
当我在 Visual Studio 2015 中遇到 [Analyze -> Run Code Analysis] 提出的有趣问题时,我正在尝试在 C 中实现归并排序。
代码如下:
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,但在第一个版本中,我收到了警告:
“写入 'R' 时缓冲区溢出:可写入大小为 '(unsigned int)rightCount*sizeof(int)' 字节,但可能写入 '8' 字节。”
知道为什么会这样吗?期待听到您的回答。
【问题讨论】:
-
@Sourav:在 c++ 中(这是 VS 中的默认设置),您必须这样做。
-
@MikeMB 是不是我们有 C 编译器来编译 C 代码?无论如何,我们应该使用它。顺便说一句,这只是一个信息丰富的评论。
-
@Ajay C++ 有
new,最好使用它。你可以射你的脚,但这并不意味着你必须。 :) -
@LPs、
free和new可以用空指针调用