Tell me why the second printf prints "0 servers"?
http://pastebin.com/k1Tx2y45
The first prints what I expect "99999"
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> typedef struct { int addr; } sl_server_t; typedef struct { sl_server_t *servers; size_t count; size_t allocated_len; } server_list_t; server_list_t server_list; void ServerList_Init(size_t count) { if (count < 1) count = 1; server_list.servers = malloc(count * sizeof(*server_list.servers)); if (!server_list.servers) { perror("realloc"); exit(1); } server_list.allocated_len = count * sizeof(*server_list.servers); server_list.count = 0; } void ServerList_Add(sl_server_t server) { for (register size_t i = 0; i < server_list.count; i++) { if (server_list.servers[i].addr == server.addr) return; } if (server_list.count > server_list.allocated_len / sizeof(*server_list.servers)) { server_list.servers = realloc(server_list.servers, server_list.count * sizeof(*server_list.servers) * 2); if (!server_list.servers) { perror("realloc"); exit(1); } server_list.allocated_len = server_list.count * sizeof(*server_list.servers) * 2; } server_list.servers[server_list.count] = server; server_list.count++; } void ServerList_Remove(sl_server_t server) { for (register size_t i = 0; i < server_list.count; i++) { if (server_list.servers[i].addr == server.addr) { server_list.servers[i] = server_list.servers[server_list.count - 1]; memset(&server_list.servers[server_list.count - 1], 0, sizeof(sl_server_t)); server_list.count--; } } } sl_server_t* ServerList_GetListPtr() { return server_list.servers; } int main() { ServerList_Init(2); sl_server_t srv; for (size_t i = 1; i < 100000; i++) { srv.addr = i; ServerList_Add(srv); } sl_server_t *servers = ServerList_GetListPtr(); size_t count = 0; while (servers->addr) { servers++; count++; } printf("%d\n", count); for (size_t i = 1; i < 10000; i++) { srv.addr = i; ServerList_Remove(srv); } for (size_t i = 10000; i < 100000; i++) { srv.addr = i; ServerList_Add(srv); } for (size_t i = 10000; i < 100000; i++) { srv.addr = i; ServerList_Remove(srv); } servers = ServerList_GetListPtr(); count = 0; while (servers->addr) { servers++; count++; } printf("ok: %d servers", count); }