gpt4 book ai didi

c - 从函数中的数组参数存储指向文件范围内数组的指针

转载 作者:太空宇宙 更新时间:2023-11-04 04:54:05 24 4
gpt4 key购买 nike

我正在重建一个应用程序以符合 MISRA 规则并使用 QA-C 来分析我的代码。

其中一个烦人的规则涉及指针和数组。你不能说:

char foo[10];
char * bar = &(foo[0]);

bar[5] = 'a';

你也不能这样做:

*bar = 'a';
bar++;

我的问题涉及两个函数和一个文件范围变量。

最初此代码执行以下操作(类似于位伪代码):

static char * bufferPtr;

static void foo_a(char * buffer /* other params */)
{
bufferPtr = buffer;

/* some logic goes here */
switch()
{
case 'b':
foo_b(/* some param */);
}

static void foo_b(/* parameters */)
{
if (/*something*/)
{
/* some logic */
foo_c(/* data-param */);
/* some logic */
}
else
{
/* some logic */
foo_c(/* data-param */);
/* some logic */
}
}

static void foo_c(char data)
{
*buffer++ = data;
}

我尝试将其重写为以下内容:

static char (*bufferPtr)[];
static char bufferIndex;

static void foo_a(char buffer[] /* other params */)
{
bufferPtr = &buffer;
bufferIndex = 0;

/* same */
}

static void foo_b(/* parameters */)
{
/* same */
}

static void foo_c(char data)
{
(*bufferPtr)[bufferIndex] = data;
bufferIndex++;
}

但是 misra 和我的编译器(富士通的 softune)都会提示。编译器说:

assignment incompatible pointer types from CHAR **' toCHAR (*)[]': operator `='

米斯拉说:

[C] Right operand of assignment is not of compatible pointer type. Address of automatic object exported to a pointer with linkage or wider scope.

但是我确实需要能够在 foo_c 函数中索引一个数组。或者是否有其他方法可以遵循 misra 并使我的代码正常工作。

如果我在同一文件中执行以下操作:

static CHAR foo[10];
static CHAR (*bar)[];
static void f(void)
{
bar = &foo;
}

然后 Misra 和我的编译器都不会提示任何事情。

最佳答案

这对我来说没有意义:

static char (*bufferPtr)[];
static char bufferIndex;

我会这样做:

static char *bufferPtr_new;
static int bufferIndex_new;

并用 bufferPtr_new[bufferIndex_new] 替换每个 *bufferPtr但根据 MISRA,也许可以向我们解释当前代码的问题。

关于c - 从函数中的数组参数存储指向文件范围内数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11312756/

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