我知道这个问题存在于其他地方,例如:
pointer being freed was not allocated in C error: pointer being freed was not allocated
但是,我仍然很困惑。错误似乎与诸如“修改malloc返回的原始指针”和“在释放之前未能使用malloc”之类的事情相关联。我只是看不出这些原因如何适用于我的程序。我正在写一个动态分配的字符串数组:
sub sortByDate{
my @a = split(/\//,$a);
my @b = split(/\//,$b);
return $a[2]<=>$b[2] || $a[0]<=>$b[0] || $a[1]<=>$b[1];
}
当我尝试“释放”时,我收到错误:“未分配指针被释放” 在
#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;
}
在freeArray()中的for循环的第一次迭代中;
非常感谢帮助。
答案 0 :(得分:2)
在您的代码中,通过说
a->array[a->used++] = element;
您正在按malloc()
覆盖已分配的内存,因此,稍后将其传递给free()
会导致问题。
相关,引用C11
,章节§7.22.3.3, free
函数,(强调我的)
free
函数导致ptr指向的空间被释放,即make 可供进一步分配。如果ptr
是空指针,则不执行任何操作。否则,如果 该参数与先前由内存管理返回的指针不匹配 函数,或者如果通过调用free或realloc释放空间,则 行为未定义。
此外,稍后,这会导致memory leak,因为malloc()
分配的内存实际上没有free()
- d。
解决方案:您应该使用strcpy()
将内容复制 分配的内存。
答案 1 :(得分:0)
问题的根源是:
a->array[a->used++] = element;
它有两个问题:
泄漏内存。 malloc()
返回的内存丢失。
它指向用于字符串文字的只读内存,当您在其上调用free
时会导致问题。
用
替换该行strcpy(a->array[a->used++], element);
答案 2 :(得分:0)
我看到两个问题: -
a->array[a->used++] = element;
您已经分配了内存,但在使用它时,您再次将其指向其他位置导致内存泄漏。所以将其改为: -
strcpy(a-&gt; array [a-&gt; used ++],element);
像这样更改FreeArray
(你释放内存而不是使用它,导致seg错误)。
void freeArray(array_t *a) {
int i;
for(i = 0; i < a->size; i++) {
free(a->array[i]);
}
free(a->array);
a->array = NULL;
a->used = a->size = 0;
free(a);
}