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
Post a Comment