字符串數組我知道存在於其他地方這個問題,如:指針被釋放沒有被分配在C
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是不正確的?它應該改變什麼?我並不真正瞭解該鏈接下的修復程序。 – Chris
請注意,在'insertArray()'中,您有成語'old_ptr = realloc(old_ptr,new_size);'。這不好。如果(當!)'realloc()'失敗時,你泄漏內存,因爲'old_ptr'被NULL覆蓋,所以你不能再釋放舊內存,即使它仍然被分配。使用'new_ptr = realloc(old_ptr,new_size); if(new_ptr == NULL){...報告錯誤等...} old_ptr = new_ptr;'(通常也是'old_size = new_size;'也是)。 –