将可变大小的数组分配给固定大小的数组c

时间:2018-05-02 17:17:05

标签: c arrays pointers

我有一个字符缓冲区,定义为char *buffer。当我发送XBEE数据包数据时,有一个固定的大小要求(84字节)。我的问题是我不知道如何迭代将缓冲区转换为84字节块。这是我得到的:

warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
     packet = (buffer + i);
            ^

我的代码:

int sendSerialBuffer(char *buffer, int length)
{
  int i = 0;
  int result = 0;
  char (* packet)[84];

  // Iterate through all the bytes in the buffer
  for (i = 0; i < length; i = i + 84)
  {
    packet = (buffer + i);
    result = sendPacket(packet)
  }
  return 0;
}

修改: 我也试过声明像char packet[84];这样的数据包并获取:

error: assignment to expression with array type
     packet = (buffer + i);
            ^

此外,sendPacket定义为:sendPacket(char packet[84]);

2 个答案:

答案 0 :(得分:2)

int i = 0;
int result = 0;

// Iterate through all the bytes in the buffer
for (i = 0; i < length; i = i + 84)
{
  char packet[84];
  memcpy(packet, buffer[i],84);
  result = sendPacket(packet);
}

return 0;  

请注意,这不涉及缓冲区不是84的完全倍数的情况

如果sendPAcket期望char *而不是char [84],那么生活会更容易。然后代码将读取

int i = 0;
int result = 0; 

// Iterate through all the bytes in the buffer
for (i = 0; i < length; i = i + 84)
{
  char packet[84];
  memcpy(packet, buffer[i],84);
  result = sendPacket(buffer[i]);
}

return 0;

答案 1 :(得分:1)

这不起作用:

packet = (buffer + i);

因为类型不一样。 packet的类型为char (*)[84](即指向84 char数组的指针),而buffer的类型为char *。实际上你不需要这种额外的类型。

鉴于sendPacket定义为:

int sendPacket(char packet[84])

参数packet实际上具有类型char *,因为数组作为函数参数衰减成为指向第一个元素的指针。

然后您可以按如下方式调用此函数:

result = sendPacket(buffer + i)

表达式buffer + i计算缓冲区中元素i的地址。假设sendPacket从该地址读取84个字节,它将获取缓冲区中的下一个84字节。