gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:18:03 25 4
gpt4 key购买 nike

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

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

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

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。两种形式都可以。

关于c - 在 C 中创建时初始化数组的指向地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41242704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com