我有一个处理一些数据的函数,并找到用最低错误对数据进行分类的阈值.它看起来像这样:
void find_threshold(FeatureVal* fvals, sampledata* data, unsigned int num_samples, double* thresh, double* err, int* pol) {
//code to calculate minThresh, minErr, minPol omitted
printf("minThresh: %f, minErr: %f, minPol: %d\n", minThresh, minErr, minPol);
*thresh = minThresh;
*err = minErr;
*pol = minPol;
}
Run Code Online (Sandbox Code Playgroud)
然后在我的测试文件中我有这个:
void test_find_threshold() {
//code to set up test data omitted
find_threshold(fvals, sdata, 6, &thresh, &err, &pol);
printf("Expected 5 got %f\n", thresh);
assert(eq(thresh, 5.0));
printf("Expected 1 got %d\n", pol);
assert(pol == 1);
printf("Expected 0 got %f\n", err);
assert(eq(err, 0.0));
}
Run Code Online (Sandbox Code Playgroud)
运行并且测试通过以下输出:
minThresh: 5.000000, minErr: 0.000000, minPol: 1
Expected 5 got 5.000000
Expected 1 got 1
Expected 0 got 0.000000
Run Code Online (Sandbox Code Playgroud)
但是,如果我从find_threshold中删除对printf()的调用,则突然测试失败!注释掉断言以便我可以看到返回的内容,输出是:
Expected 5 got -15.000000
Expected 1 got -1
Expected 0 got 0.333333
Run Code Online (Sandbox Code Playgroud)
我无论如何都无法理解这一点.
printf可以打电话malloc.因此,如果你有一些悬空指针,调用printf可以改变这些指向的值.如果您的程序严格遵守,那么在调用时printf(您正确期望),您不会发现这种差异.在最坏的情况下,分配printf可能会失败,但不能无声地破坏其他变量.