【发布时间】:2017-04-12 23:05:00
【问题描述】:
我知道这个问题存在于其他地方,例如:
pointer being freed was not allocated in C error: pointer being freed was not allocated
但是,我还是很困惑。错误似乎与“修改 malloc 返回的原始指针”和“在释放之前未能使用 malloc”之类的事情有关。我只是不明白这些原因如何适用于我的程序。
我正在编写一个动态分配的字符串数组:
#include <stdio.h>
#include <stdlib.h>
#define NLETTERS 25
typedef struct {
char** array;
size_t used;
size_t size;
} array_t;
array_t* initArray(size_t initialSize) {
array_t* a = malloc(sizeof(array_t));
a->array = malloc(initialSize*sizeof(char*));
a->used = 0;
a->size = initialSize;
int i;
for(i = 0; i < initialSize; i++) {
a->array[i] = malloc(sizeof(char) * NLETTERS);
}
return a;
}
void insertArray(array_t *a, char* element) {
if (a->used == a->size) {
a->size *= 2;
a->array = realloc(a->array, a->size * sizeof(char*));
int i;
for(i = (int)a->used; i < a->size; i++) {
a->array[i] = malloc(sizeof(char) * NLETTERS);
}
}
a->array[a->used++] = element;
}
void freeArray(array_t *a) {
int i;
for(i = 0; i < a->size; i++) {
free(a->array[i]);
}
free(a->array);
free(a);
a->array = NULL;
a->used = a->size = 0;
}
void print_array(array_t *a) {
int i;
for(i = 0; i < a->size; i++) {
printf("%s\n", a->array[i]);
}
}
int main(int argc, const char * argv[]) {
array_t *a;
a = initArray(2);
insertArray(a, "hello");
insertArray(a, "how are you");
print_array(a);
insertArray(a, "yup");
insertArray(a, "you know it");
print_array(a);
freeArray(a);
return 0;
}
当我尝试“释放”时,我收到错误消息:“未分配被释放的指针” 就在
free(a->array[0])
在freeArray()中for循环的第一次迭代中;
我们将不胜感激。
【问题讨论】:
-
你是在暗示我的 realloc 不正确吗?应该改成什么?我真的不明白该链接下的修复是什么。
-
请注意,在
insertArray()中,您有成语old_ptr = realloc(old_ptr, new_size);。这是不好的。如果(何时!)realloc()失败,您会泄漏内存,因为old_ptr被 NULL 覆盖,因此您不能再释放旧内存,即使它仍然被分配。使用new_ptr = realloc(old_ptr, new_size); if (new_ptr == NULL) { …report error, etc… } old_ptr = new_ptr;(通常也使用old_size = new_size;)。
标签: c pointers memory-management free dynamic-memory-allocation