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); } 
  • Add code to the body of the question. - D-side
  • First you insert 99999 addresses, then delete them. - avp
  • Well, you need to test the new code. - Vitaly Karpenko
  • You know, in programming there are such concepts - one, two, many. So test in order. Add 1 address, print. Then ... (paint everything?) - avp

1 answer 1

Initially, you allocate space for 2 elements, right? And with your logic, when will the allocation of new memory? when count becomes 3, i.e. when elements 0, 1 and 2 will be written (well, with addr 1, 2 and 3). Those. you fly out of the array.

Further did not even consider ...

  • Saw, changed if (server_list.count > server_list.allocated_len / sizeof(*server_list.servers)) to if (server_list.count >= server_list.allocated_len / sizeof(*server_list.servers)) , but everything exactly zero servers writes where something else or am I wrong? - Vitaly Karpenko
  • @Vitaly What do you expect? You then delete the first 10,000, then try to re-add existing ones (they will not be added), then delete the rest. It seems like everything is right ... What do you want to get? - Harry
  • Yes, I don’t really know how to work with dynamic memory. I want to make a list of servers of unlimited size in which you can add servers, delete them by address (int for the test, it will be necessary for ip later) and get a list of all servers. - Vitaly Karpenko
  • @Vitaly Well, it seems to work the same. I asked - what do you expect from the second conclusion, what exactly do you think should be derived? And - how critical is C, C ++ do not want? there is a mass of ready-made solutions, it’s just that your option is not the fastest one - with checking whether there is an entry in the collection ... - Harry
  • Ah, I revised and understood that zero should be, in general, I expected values ​​greater than zero, I did not hesitate to insert an arbitrary count. servers and then deleted some count. for the test but accidentally added as much as deleted. There is already a python implementation, I wanted to rewrite it in C for practice, but I’m kind of familiar with it normally, but I don’t have much practice, and I love C, but I don’t like C ++, its ideology is not for me, the language itself is not bad for me but I don't like to write on it. - Vitaly Karpenko