C 显示链接列表时出错

C 显示链接列表时出错,c,C,各位, 我不知道我是否在问一个愚蠢的问题。但我试图解决我的问题,但失败了 我的结构是 typedef struct { uint16 nwkaddr; uint8 extaddr[8]; }device_t; typedef struct node{ device_t list; struct node *link; }address_list; 来自UART的数据是 1010、23CD1234、CD32454F、12F439AF、。我需要解析并存储mac列表 while

各位, 我不知道我是否在问一个愚蠢的问题。但我试图解决我的问题,但失败了

我的结构是

typedef struct {
  uint16 nwkaddr;
  uint8 extaddr[8];
}device_t;

typedef struct node{
   device_t list;
   struct node *link;
}address_list;
来自UART的数据是 1010、23CD1234、CD32454F、12F439AF、。我需要解析并存储mac列表

while(data[j] != '!')
        {
    if(data[i] == ',')
    {
      i = i+1;
      memset(addr, 0, 9);
      memcpy(addr, &data[i], 8);
                // addr[8] = '\0';
             if(addr != 0)
              {
                   insert_MacList(addr);
              }
    }
    i = i+8;
    j = i+1;
        }
创建的列表是

void insert_MacList(uint8 *mac)
{
    address_list *curr, *temp;

    //curr = (address_list*)malloc(sizeof(address_list));
    curr = osal_mem_alloc(sizeof(address_list));
    strcpy((char*)curr->list.extaddr, (char const*)mac);
        temp = head;
        if(head == NULL)
        {
          head = curr;
          head->link = NULL;
        }
        else
        {
          while(temp->link !=NULL)
          {
            temp = temp->link;
          }
          curr->link = NULL;
          temp->link = curr;
        }
}
我正在尝试打印所有地址,但无法获取23CD1234。但在那之后,我得到了正确的答案

void check_inlist(void)
{
  address_list *temp;

  temp = head;

  while(temp != NULL)
  {
      /*print data and send to UART*/  
      temp = temp->link;
  }
}

为什么head会变为第二个元素,23值会产生一些问题吗?。因此,您可以帮助我使用strcpy复制非空终止的数据

您可以这样更改它:

strncpy((char*)curr->list.extaddr, (char const*)mac, sizeof curr->list.extaddr);  // strncpy won't write past the end of the array
你有

typedef struct {
  uint16 nwkaddr;
  uint8 extaddr[8];
}device_t;
但是在
insert\u MacList()
中调用

strcpy((char*)curr->list.extaddr, (char const*)mac);

复制9个字节的内容(8个值+终止
'\0'
)。这可能会导致问题。

addr
传递给
insert\u MacList()
的是NUL终止的my
memset(..,9)
数据不适合。8个字符+空终止符=9个字符,大于缓冲区。如果要保持数据以null结尾,可以将数组扩展到9个字符。