在结构内部的数组中插入项目-指针出现问题?

问题描述 投票:0回答:1

这是我当前项目中的头文件,其中定义了两个结构:

typedef struct{
        unsigned char length;
        unsigned char buffer[8];
        unsigned char index;
    } buffer;

typedef struct {
    volatile unsigned char * SFR;
    unsigned char risingEdges;
    unsigned char fallingEdges;
    unsigned char buffer[2]; 
    buffer * b;
}port;

现在,当我调用此方法时,特殊功能寄存器的当前值(通过使用结构中的SFR指针)将插入缓冲区* b。

void portUpdate(port p){
    bufferInsertItem(*p.SFR,*p.b);
    **** More C code omitted 
}

这是bufferInsertItem的实现

void bufferInsertItem(char i,buffer b){
    b.buffer[b.index]=i;
    b.index = b.index++%b.length;
}

我不确定,目前无法测试此嵌入式项目,但是在调用时是否应该真正取消引用缓冲区。我有点困惑,也是因为数组的名称已经是指向第一个元素的指针。那么*p.b的真正值是多少?

bufferInsertItem(*p.SFR,*p.b);

我非常确定* p.SFR是特殊功能寄存器的实际值,但是* p.b是缓冲区或缓冲区中第一个元素的值吗?

c pointers
1个回答
0
投票

使用问题中显示的代码,bufferInsertItem的第二个参数是buffer b,表示它是buffer

在呼叫bufferInsertItem(*p.SFR, *p.b)中,pport,并且其b成员是buffer *,即指向buffer的指针。因此,*p.bbuffer,在给定其当前定义的情况下,这应该传递给bufferInsertItem

但是,这不太可能是所需的解决方案。根据其当前定义,bufferInsertItem接收buffervalue。即,它收到一份副本。顾名思义,它旨在更改缓冲区,但只能更改副本,而不会在原始副本中创建任何更改。要解决此问题,应将参数类型更改为buffer *b,以便传递指针。为了将bufferInsertItem用作指针而不是结构,需要在b内部进行相应的更改,然后调用应传递p.b,而不是*p.b

在评论中说,声明void portUpdate(port p)应该更改为void portUpdate(port *p),但这对于使bufferInsertItem起作用不是必需的。当传递portUpdate的副本时,该副本包含成员p,该成员是指向原始buffer *b的指针,因此可以通过调用buffer修改原始缓冲区。但是,出于效率的考虑,即使通过值传递也可以通过地址传递结构,这是出于效率的考虑(用于传递单个地址的空间要小于传递整个结构的空间)。因此可以将bufferInsertItem(*p.SFR, p.b)修改为void portUpdate(port p),并在其他代码中进行相应的更改。

void portUpdate(port *p)的使用不涉及数组,因此目前尚不清楚为什么这个问题询问数组。可能已经为buffer的数组分配了内存,并且buffer设置为指向该数组的第一个p.b。但是,必须为参数buffer提供一个参数buffer b,而不是指向缓冲区的指针。

© www.soinside.com 2019 - 2024. All rights reserved.