“不!” 是正确的答案,但不幸的是它不是我需要的。
如果我做:
size_t array_size = func_that_calc_array_size();
char *foo = new char[array_size];
if (array_size > 42)
foo[42] = 'X';
这都是完全合法的,但我的 MISRA C++ 代码检查器在 上给出了错误 5-0-15 foo[42]
,它表示“数组索引应该是指针算术的唯一形式”。这个问题实际上之前已经被问过,但是问题和答案错过了一个关键问题,即文档进一步指出:
数组索引只能应用于定义为数组类型的对象。
如果您查看文档(通过搜索“misra c++ 2008 pdf”可以找到可疑的盗版副本),它有一个类似于以下内容的示例:
void my_fn(uint8_t *p1, uint8_t p2[])
{
p1[5] = 0; // Non-compliant - p1 was not declared as array
p2[5] = 0; // Compliant
}
因此,基本上代码检查工具将声明与用法相匹配。有没有办法将指针转换为数组?
在我们的真实示例中,我们使用的是 OpenCV uchar *cv::Mat::ptr()
,因此我们不能只保留一个足够大的数组。