我目前使用的结构列表如下所示:
这是一个从列表中删除元素的功能。我从一个for循环开始遍历整个列表。如果i小于输入if语句的条目数。然后它把旧位置变成了一个持有ptr。使旧的on =为NULL,然后移动列表,使下面的元素占据其位置。
当我调用此函数时,下面是一个示例列表:
100 125 150
当我这样做并且我想从列表中删除150时,它会通过但无法访问列表中的内存 - > wlist_ptr [i] - > eth_address。然后我得到一个固定的错误。失去轨道有什么方法吗?
答案 0 :(得分:0)
一些例子:
struct wifi_info_t *wifilist_remove(struct wifilist_t * list, int user_address)
{
int i;
struct wifi_info_t *ptr;
ptr = NULL;
for(i=0; i < wifilist_number_entries(list); i++)
{
if(list -> wlist_ptr[i] -> eth_address == user_address)
{
ptr = list -> wlist_ptr[i];
if(i != (wifilist_number_entries(list) -1))
{
//replace it with last element
list -> wlist_ptr[i] = list -> wlist_ptr[wifilist_number_entries(list)-1];
list -> wlist_ptr[wifilist_number_entries(list)-1] = ptr;
}
//you can use free and realloc there if you want
list->wlist_entries--;
}
}
//why? don't do that
return ptr;
}
答案 1 :(得分:0)
循环中存在一个很大的错误。
只有一个元素“向上移动”,并且在设置为null后它会向上移动。
所以,这个 列表 - &gt; wlist_ptr [i] = NULL; list-&gt; wlist_ptr [i-1] = list-&gt; wlist_ptr [i];
需要更改为此以防止向上移动NULL:
list->wlist_ptr[i-1] = list->wlist_ptr[i];
list -> wlist_ptr[i] = NULL;
但是,然后需要循环遍历列表的其余部分以将其移动。 memmove
是你的朋友。请记住,完成后,您不希望为下一次迭代增加i
,因为列表中的下一个元素现在将位于原始i
位置。
也许这会完成这项工作:
struct wifi_info_t *wifilist_remove(struct wifilist_t * list, int user_address)
{
int i;
int count;
struct wifi_info_t *ptr;
ptr = NULL;
count = wifilist_number_entries(list);
// TODO: take out the ( ptr == NULL ) logic if more than one match needs to be
// removed.
for(i=0; ( i < count ) && ( ptr == NULL ); i++)
{
if(list -> wlist_ptr[i] -> eth_address == user_address)
{
ptr = list -> wlist_ptr[i];
if ( i < ( count - 1 ) )
memmove(&(wlist_ptr[i]), &(wlist_ptr[i + 1]), (count - (i + 1)) * sizeof(wlist_ptr[0]));
// TODO: decrement the length of the list returned by
// wifilist_number_entries(list)
}
}
if(ptr != NULL)
{
list->wlist_entries--;
}
return ptr;
}
请注意,我刚刚输入此内容,因此可能会出现语法错误等。