2016-11-29 160 views
0

字符串數組我知道存在於其他地方這個問題,如:指針被釋放沒有被分配在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循環的第一次迭代中使用

;

幫助將不勝感激。

+0

你是在暗示我的realloc是不正確的?它應該改變什麼?我並不真正瞭解該鏈接下的修復程序。 – Chris

+0

請注意,在'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;'也是)。 –

回答

2

在你的代碼,說

a->array[a->used++] = element; 

你被malloc()覆蓋分配的內存,所以,後來當它傳遞給free()導致該問題。

相關,引用C11,章§7.22.3.3,free功能,(重點煤礦

The free function causes the space pointed to by ptr to be deallocated, that is, made available for further allocation. If ptr is a null pointer, no action occurs. Otherwise, if the argument does not match a pointer earlier returned by a memory management function, or if the space has been deallocated by a call to free or realloc, the behavior is undefined.

此外,在稍後的點,這會導致memory leak,作爲存儲器由分配malloc()實際上沒有得到free() -d。

解決方案:您應該使用strcpy()複製內容分配的內存。

0

問題的來源是線:

a->array[a->used++] = element; 

它有兩個問題:

  1. 它泄漏內存。由malloc()返回的內存丟失。

  2. 它指向只讀內存用於字符串文字,當您調用free時會導致問題。

替換

strcpy(a->array[a->used++], element); 
0

該行我看到兩個問題: -

  1. a->array[a->used++] = element;
    您已分配的內存,但就地使用,你再次將其指向一些其他位置導致內存泄漏。因此將其更改爲: -

    strcpy(a-> array [a-> used ++],element);

  2. 更改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); 
    } 
    
相關問題