我有一个二进制搜索函数,界面如下:
bool binarysearch(int* array, int size, int findnum) {
doBinarySearch(array, 0, (size-1), findnum);
}
doBinarySearch 的代码是:
bool doBinarySearch(int* array, int start, int end, int findnum) {
if (end <= start)
return false;
int mid = (start+end)/2;
if (array[mid] == findnum) {
return true;
} else if (findnum < array[mid]) {
return doBinarySearch(array, start, mid, findnum);
} else {
return doBinarySearch(array, mid+1, end, findnum);
}
}
我写了一个单元测试来测试上面的功能。如果我从 main 调用带有空数组和错误大小的二进制搜索,代码段。如预期的故障。例如
int main() {
int *array;
binarysearch(array, 10, -1);
}
但是,如果我编写一个单元测试类并具有执行上述操作的函数,则二分查找不会崩溃。任何想法,为什么不同的行为:
class TestBinarySearch {
public:
void testEmptyArray() {
int *array;
binarysearch(array, 10, -1);
}
};
int main() {
TestBinarySearch testObj;
// below line does not cause seg fault. and -1 is found for some reason
testObj.testEmptyArray();
}
另一个问题 - 有什么方法可以检测段。如果有人调用错误大小的函数会出错?我看到了一些使用信号捕捉的例子,但是之后除了退出程序,还能做些什么吗?
最佳答案
两种写法都会调用未定义的行为。未定义的行为可以是任何。它坠毁在一个你应该感激的地方;它在另一个方面“成功”是不幸的,但很有可能。下次您重新启动计算机或运行该程序时,这种行为甚至可能会改变,谁知道呢。它是未定义的。
如果您使用的是 Linux,请在 valgrind 下运行这两个程序并查看其显示的内容。即使没有崩溃,它也可能报告错误。
关于c++ - 如何检测以错误大小传递的空 C 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25394899/