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终止的mymemset(..,9)
数据不适合。8个字符+空终止符=9个字符,大于缓冲区。如果要保持数据以null结尾,可以将数组扩展到9个字符。