2016-06-21 15 views
1

我有這樣的功能:免費多維字符**用C不工作

char** init_matrix(int rows, int columns){ 
    char **matrix = (char **)malloc (rows*sizeof(char *)); 
    for(int i = 0; i < rows; i++){ 
     matrix[i] = (char *) malloc (columns*sizeof(char)); 
     for(int j = 0; j < columns; j++){ 
      matrix[i][j] = '-'; 
     } 
    } 
    return matrix; 
} 

void show_matrix(char **matrix, int rows, int columns){ 
    printf("\n\n"); 
    for(int i = 0; i < rows; i++) { 
     for(int j = 0; j < columns; j++) 
      printf("|%c|", matrix[i][j]); 
     printf("\n"); 
     for(int j = 0; j < columns; j++) 
      printf("---"); 
     printf("\n"); 
    } 
} 

void setValueInMatrix(char** matrix, int row, int column, char value){ 
    matrix[row][column] = value; 
} 

那麼我這樣做

char **matrix = init_matrix(rows, columns); 
setValueInMatrix(matrix, solucion->row, solucion->column, solucion->aminoacido); 
printf("matrix before free\n"); 
show_matrix(matrix, rows, columns); 
    for(int i = 0; i < rows; i++){ 
     free(matrix[i]); 
    } 
    free(matrix); 
printf("matrix after free\n"); 
show_matrix(matrix, rows, columns); 

爲什麼輸出是相同之前和以後有空? :S

輸出:

matrix before free 


|-||-||-||H||-||-||-| 
--------------------- 
|-||-||-||P||-||-||-| 
--------------------- 
|-||-||-||P||-||-||-| 
--------------------- 
|-||-||-||H||-||-||-| 
--------------------- 
|-||-||-||-||-||-||-| 
--------------------- 
|-||-||-||-||-||-||-| 
--------------------- 
|-||-||-||-||-||-||-| 
--------------------- 
matrix after free 


|-||-||-||H||-||-||-| 
--------------------- 
|-||-||-||P||-||-||-| 
--------------------- 
|-||-||-||P||-||-||-| 
--------------------- 
|-||-||-||H||-||-||-| 
--------------------- 
|-||-||-||-||-||-||-| 
--------------------- 
|-||-||-||-||-||-||-| 
--------------------- 
|-||-||-||-||-||-||-| 
--------------------- 

我已閱讀所有這些職位,但它並不像它的工作原理:

  1. C: Correctly freeing memory of a multi-dimensional array

  2. how to free c 2d array

  3. how to properly free a char **table in C

  4. How to properly free char** in C

+0

您預期輸出了什麼? –

+0

'show_matrix(matrix,rows,columns);'在你釋放其中檢查的內容後調用*未定義的行爲*。簡而言之,你從這一點*看到的是無關緊要的*,因爲你對最終行爲的期望已經被你自己的手所壓制。 – WhozCraig

+0

'char **'是一個標量。它沒有維度(s)!如果你的意思是二維數組:'char **'不是二維數組,並且不能表示一個數組。 – Olaf

回答

3

爲什麼輸出是相同的前,後免費

  • 這是undefined behaviour

  • 一旦你已經釋放的內存,你一定要記住不要再使用它。

  • 調用

    free(matrix); 
    

後你正在因爲你的情況

matrix仍然指向同一內存相同的輸出。

然而,由於matrix被釋放,它現在可以再次使用

注:matrix威力或釋放後可能不會指向同一塊,這是未定義的行爲但是,在你的情況下,它確實指向同一個塊

瞭解更多此處:click


爲了避免這種情況,每當你釋放它時,指定一個指向NULL的指針。這是一個很好的做法。

matrix=NULL; 
+0

'你得到相同的輸出,因爲矩陣仍然指向相同的內存.' __NO__,這不是保證。這裏只有UB纔是真實的。 –

+0

是的指針可能指向或不指向相同的內存......但它在這種情況下@SouravGhosh – Cherubim

+0

......這是UB的另一個結果。 –

2

輸出是相同的,因爲自由標記作爲自由(可重用)的存儲器。它不物理擦除內存。

但是,在你釋放它之後使用指針是代碼不應該做的事情,因爲你正在讀/寫可能已被分配用於不同目的的內存。

一旦你的「空閒」的內存,你必須考慮指針變量(矩陣)爲無效。類似地,在同一個指針上調用free()兩次被稱爲double-free,並且會導致程序崩潰或導致其他不良行爲。

許多人在釋放指針變量後將它們設置爲NULL,以防止意外重用。

與'C'中的許多事情一樣,語言規範允許您違反規則,但是您會這樣做以免造成您的危險。

+1

語言規範不允許您違反規則;你的編譯器呢。 –

+1

@LightnessRacesinOrbit並添加,僅僅因爲你可以拍攝你的腳,並不意味着你擁有__。 :) –