首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从函数中的数组参数将指向数组的指针存储在文件范围内

从函数中的数组参数将指向数组的指针存储在文件范围内
EN

Stack Overflow用户
提问于 2012-07-03 14:10:45
回答 5查看 1.8K关注 0票数 1

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

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

代码语言:javascript
复制
char foo[10];
char * bar = &(foo[0]);

bar[5] = 'a';

你也不能这样做:

代码语言:javascript
复制
*bar = 'a';
bar++;

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

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

代码语言:javascript
复制
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;
}

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

代码语言:javascript
复制
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和我的编译器(Fujitsu的软调)都抱怨。编译器说:

来自CHAR **' toCHAR (*)[]':运算符`=‘的赋值不兼容指针类型

米斯拉说:

分配的右操作数不是兼容的指针类型。导出到具有链接或范围更宽的指针的自动对象的地址。

但是,我确实需要能够在foo_c函数中索引数组。或者还有其他的方法来跟踪misra并使我的代码工作。

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

代码语言:javascript
复制
static CHAR foo[10];
static CHAR (*bar)[];
static void f(void)
{
    bar = &foo;
}

那么米斯拉和我的编译器也不会抱怨任何事。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-07-06 10:05:45

我已经更改了这个代码的流,只将缓冲器参数传递给每个后续版本。

这是丑陋的,但它的工作和有点安全。“根据米斯拉”

票数 0
EN

Stack Overflow用户

发布于 2012-07-03 14:19:46

这对我来说毫无意义:

代码语言:javascript
复制
static char (*bufferPtr)[];
static char bufferIndex;

我会这样做的:

代码语言:javascript
复制
static char *bufferPtr_new;
static int bufferIndex_new;

并且用bufferPtr_newbufferIndex_new替换每一个*bufferPtr,但是也许可以向我们解释当前代码的问题所在,MISRA说。

票数 0
EN

Stack Overflow用户

发布于 2012-07-03 14:45:01

不知道你会不会喜欢这个:

代码语言:javascript
复制
static char *(bufferPtr[10]); /* must have a size */
static char bufferIndex;

static void foo_a(char buffer[])
{
    *bufferPtr = buffer;
    bufferIndex = 0;
    /* etc */ 
}

希望能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11312756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档