我有以下功能:
unsigned* b_row_to_array(b_row r) {
unsigned a[] = {(r >> 8) & 3,
(r >> 6) & 3,
(r >> 4) & 3,
(r >> 2) & 3,
r & 3};
return a;
}
我写了以下测试函数:
TEST_METHOD(BRowToArrayTest) {
unsigned expected[] = { 0, 0, 0, 0, 0 };
unsigned* computed = b_row_to_array(0);
for (int i = 0; i < 1; i++) {
Assert::AreEqual(expected[i], computed[i]);
}
}
但测试失败,说“预期:&lt; 0&gt;,Actual:&lt; 42348989&gt;”,其中Actual的值与每次测试都不同,因此必须读取错误的地址。我使用指针错误还是读取越界因为测试函数不在同一个项目中?我该如何解决这个问题?
答案 0 :(得分:0)
那是因为你的函数返回一个指向一个立即被销毁的局部变量的指针。它和你写的没什么不同:
T* b_row_to_array(b_row r) {
T a = { ... };
return &a;
// <== a destroyed, so we have dangling pointer
}
如果您希望这样做,则需要a
才能使用。这意味着要么分配它:
unsigned* b_row_to_array(b_row r) {
unsigned* a = new unsigned[5];
...
return a;
}
或按值返回:
std::array<unsigned, 5> b_row_to_array(b_row r);