Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 设置大小时内存错误_C_Memory Management - Fatal编程技术网

C 设置大小时内存错误

C 设置大小时内存错误,c,memory-management,C,Memory Management,下面是我写的集合结构: struct state_set { struct state ***state_array; size_t *slot_sizes; size_t *slot_memory; }; 这是一个初始值设定项: struct state_set *state_set_init() { struct state_set *new_set = malloc(sizeof(struct state_set)); ne

下面是我写的集合结构:

struct state_set
{
    struct state ***state_array;
    size_t *slot_sizes;
    size_t *slot_memory;
};
这是一个初始值设定项:

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));
    for (int i = 0; i < ARRAY_SIZE; i++)
    {
        new_set->slot_sizes[i] = 0;
        new_set->slot_memory[i] = INITIAL_SLOT_SIZE;
    }
    for (int i = 0; i < 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;
}
问题是-为什么
state\u set\u resize\u slot()
不起作用?我看不出这个realloc有任何错误,我已经盯着这个代码看了至少一个小时了。(很明显,realloc是我所有麻烦的原因)。或者,可能大小调整函数编写得很好,我应该在其他地方查找错误

编辑:

如果有人想看一看完整的代码,可以在这里找到: (散列函数返回1而不是h,因为我正在测试冲突,而且初始值设定项和析构函数也过时了,现在我正在malloc'ing slot_内存和slot_大小的数据,而不是使用堆栈)

下面是运行程序的valgrind输出,该程序添加了几个要设置的状态(错误大约为第三个):


在您的函数中,您将指针放入
以调整大小,然后
realloc
内存,但您从未将新指针设置回
set->state\u数组[slot\u i]
,因此它将丢失,您继续使用旧的、已释放的内存空间,并将指向其边界之外

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;
}
==20979== Invalid write of size 8
==20979==    at 0x400C21: state_set_add (state_set.c:93)
==20979==    by 0x400781: main (main.c:22)
==20979==  Address 0x51f2320 is 0 bytes inside a block of size 40 free'd
==20979==    at 0x4C2BB1C: realloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==20979==    by 0x4009CD: state_set_resize_slot (state_set.c:54)
==20979==    by 0x400B23: state_set_add (state_set.c:78)
==20979==    by 0x400781: main (main.c:22)
==20979== 
==20979== Invalid free() / delete / delete[] / realloc()
==20979==    at 0x4C2BB1C: realloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==20979==    by 0x4009CD: state_set_resize_slot (state_set.c:54)
==20979==    by 0x400B23: state_set_add (state_set.c:78)
==20979==    by 0x4007B2: main (main.c:23)
==20979==  Address 0x51f2320 is 0 bytes inside a block of size 40 free'd
==20979==    at 0x4C2BB1C: realloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==20979==    by 0x4009CD: state_set_resize_slot (state_set.c:54)
==20979==    by 0x400B23: state_set_add (state_set.c:78)
==20979==    by 0x400781: main (main.c:22)
==20979== 
a.out: state_set.c:20: error_validate_pointer: Assertion `ptr != ((void *)0)' failed.