c - Memory error in set resize -


here's structure of set i've written:

struct state_set {     struct state ***state_array;     size_t *slot_sizes;     size_t *slot_memory; }; 

here's initializer:

struct state_set *state_set_init() {     struct state_set *new_set =             malloc(sizeof(struct state_set));     new_set->state_array = malloc(array_size * sizeof(struct state**));     new_set->slot_sizes = malloc(array_size * sizeof(size_t));     new_set->slot_memory = malloc(array_size * sizeof(size_t));     (int = 0; < array_size; i++)     {         new_set->slot_sizes[i] = 0;         new_set->slot_memory[i] = initial_slot_size;     }     (int = 0; < array_size; i++)     {         new_set->state_array[i] =                 malloc(new_set->slot_memory[i] * sizeof(struct state*));         error_validate_pointer(new_set->state_array[i]);     }      return new_set; } 

and there's resizing function causes memory errors:

void state_set_resize_slot(struct state_set *set, int slot_i) {     struct state **to_resize = set->state_array[slot_i];     to_resize =             realloc(to_resize, set->slot_memory[slot_i] * 2 * sizeof(struct state*));     error_validate_pointer(to_resize);     set->slot_memory[slot_i] *= 2; } 

the question - why state_set_resize_slot() not working? can't see error realloc, , i've been staring @ code @ least hour. (and realloc cause of trouble). or maybe resizing function written , should errors elsewhere?

edit:

if wants take peek @ full code, it's available here: http://pastebin.com/bfh3ardi (hash function returns 1 instead of h because i'm testing collisions, initializer , destructor function outdated, i'm malloc'ing data slot_memory , slot_sizes instead of using stack).

and here's valgrind output running program adds several states set (error @ third resize):

==20979== invalid write of size 8 ==20979==    @ 0x400c21: state_set_add (state_set.c:93) ==20979==    0x400781: main (main.c:22) ==20979==  address 0x51f2320 0 bytes inside block of size 40 free'd ==20979==    @ 0x4c2bb1c: realloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) ==20979==    0x4009cd: state_set_resize_slot (state_set.c:54) ==20979==    0x400b23: state_set_add (state_set.c:78) ==20979==    0x400781: main (main.c:22) ==20979==  ==20979== invalid free() / delete / delete[] / realloc() ==20979==    @ 0x4c2bb1c: realloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) ==20979==    0x4009cd: state_set_resize_slot (state_set.c:54) ==20979==    0x400b23: state_set_add (state_set.c:78) ==20979==    0x4007b2: main (main.c:23) ==20979==  address 0x51f2320 0 bytes inside block of size 40 free'd ==20979==    @ 0x4c2bb1c: realloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) ==20979==    0x4009cd: state_set_resize_slot (state_set.c:54) ==20979==    0x400b23: state_set_add (state_set.c:78) ==20979==    0x400781: main (main.c:22) ==20979==  a.out: state_set.c:20: error_validate_pointer: assertion `ptr != ((void *)0)' failed. 

in function taking pointer to_resize, realloc memory, never set new pointer set->state_array[slot_i], lost , keep on using old, freed memory space , point outside bounds.


Comments

Popular posts from this blog

c# - Validate object ID from GET to POST -

node.js - Custom Model Validator SailsJS -

php - Find a regex to take part of Email -