在 C 中创建时初始化数组的指向地址

Initialize an array's pointed address on creation in C

作为汽车嵌入式开发的新手,我目前面临一个指针问题,我需要将其初始化为给定地址,稍后用于浏览微控制器的 ROM。

由于我的代码必须符合 MISRA-C 2004,我想在声明时初始化此指针而不分配新内存,无论如何都不会使用,但是,为了避免“不要使用指针运算”MISRA-错误,我需要将其声明为数组。

让我向您展示我当前的代码以进行说明:

static uint8* MemoryCursor_p = FIRST_ADDRESS_POINTED_BY_CURSOR;
/* Some cool stuff happens here*/
MemoryCursor_p = &( MemoryCursor_p [1]); /* Moving the cursor one byte forward in memory*/

这会导致 MISRA 检查触发错误,因为 MemoryCursor_p 未定义为数组,而是定义为指针。但是,如果我将其声明为数组,则要求我定义指向的值,但我想改为在声明时设置指向的地址。

当然,如果我只是尝试:

MemoryCursor_p += 1ul;

我用指针算法被MISRA骂了

我想避免违反 MISRA。有人可以告诉我如何进行吗?

正如关于这些代码位的指示:这是对一些内存执行校验和的简单 CRC16 算法实现的一部分。

非常感谢!

您永远不应该盲目地遵循 MISRA,更不要盲目地遵循您的静态分析器警告。

MISRA-C:2004 中提到的规则 17.4 没有任何意义。这是一种错误的尝试,试图阻止使用 *(x + i) 而不是更清晰的 x[i]。但是规则中提供的关于越界错误的基本原理没有任何意义,没有人可以争论为什么 *(x + i) 表单不那么安全(除了可读性较差)。

因此,此规则已在 MISRA-C:2012 中被替换。因此,在我看来,正确的方法是在整个公司范围内偏离规则。阻止与 17.4.

相关的所有警告

在任何情况下,您都不应该试图通过使用一些可疑的、混淆的语法来规避规则。 MemoryCursor_p++ 是正确且最清晰的形式,请使用它。或者,使用计数器变量 i 并访问数组项编号 i。两种形式都可以。

@Domack - MISRA-C:2004 关于偏差的书的前面有一整节......现在还有一整本书(MISRA C 合规性),如果您愿意,它同样适用!我同意 Lundin 的观点,你最好的选择是提出偏差,引用 2012 年的变化