显示链接列表时出错

时间:2014-04-24 10:03:05

标签: 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(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值创造了一些问题?所以有些人可以帮助我

2 个答案:

答案 0 :(得分:0)

您正在使用strcpy复制非空终止的数据!

您可以这样更改:

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

答案 1 :(得分:0)

你有

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

但是在insert_MacList()你打电话

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

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