2017-04-09 60 views
-1

它顯示我有關`./program.o'中的免費 錯誤的錯誤:double free或腐敗(出):0x0000000002316030 我該怎麼辦的代碼,我在做什麼錯了免費?謝謝。我有一個免費的問題:`./program.o'中的錯誤:雙重釋放或損壞(輸出):0x0000000002316030

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

void setInOrderArr(int *arrArr[], int len); 

void printArrays(int *arrArr[], int len); 

void setInOrderAll(int *arrArr[], int len); 


int main(void) 
{ 

    int rows = 0; 
    int length = 0; 
    int i = 0; 
    int j = 0; 
    printf("Enter number of rows: "); 
    scanf("%d", &rows); 
    int ** arrArr = (int**)malloc(sizeof(int)*rows); 

    for (i = 0; i < rows; i++) 
    { 
     printf("Enter array length for row %d: ",i); 
     scanf("%d", &length); 
     arrArr[i] = malloc(sizeof(int)* (length + 1)); 
     arrArr[i][0] = length; 
     for (j = 0; j < length; j++) 
     { 
      printf("Enter value for array: "); 
      scanf("%d",&arrArr[i][j+1]); 
     } 
    } 
    printArrays(arrArr, rows); 
    setInOrderArr(arrArr, rows); 
    printArrays(arrArr, rows); 
    setInOrderAll(arrArr, rows); 
    printArrays(arrArr, rows); 

    for (i = 0; i < rows; i++) 
    { 
     free(arrArr[i]); 
    } 
    free(**arrArr); 

    return 0; 
} 


void setInOrderArr(int *arrArr[], int len) 
{ 

    int i = 0; 
    int j = 0; 
    int k = 0; 
    int temp = 0; 
    int temp2 = 0; 
    for (i = 0; i < len; i++) 
    { 
     for (j = 1; j < arrArr[i][0]; j++) 
     { 
      for (k = 1; k < arrArr[i][0]; k++) 
      { 
       temp = arrArr[i][k]; 
       if (arrArr[i][j + 1] < temp) 
       { 
        temp2 = arrArr[i][j + 1]; 
        arrArr[i][j + 1] = temp; 
        arrArr[i][k] = temp2; 
       } 
      } 
     } 
    } 
} 


void printArrays(int *arrArr[], int len) 
{ 

    int i = 0; 
    int j = 0; 
    static int times = 0; 
    if (times == 0) 
    { 
     printf("Printing:\n"); 
    } 
    else if (times == 1) 
    { 
     printf("Sorted rows:\n"); 
    } 
    else if (times == 2) 
    { 
     printf("Ordered array:\n"); 
    } 

    for (i = 0; i < len; i++) 
    { 
     for (j = 1; j <= arrArr[i][0]; j++) 
     { 
      printf("%d ", arrArr[i][j]); 
     } 
     printf("\n"); 
    } 
    times++; 
} 

void setInOrderAll(int *arrArr[], int len) 
{ 

    int i = 0; 
    int j = 0; 
    int** arrTmp = { 0 }; 
    for (i = 0; i < len; i++) 
    { 
     for (j = 0; i < len - 1 - j; j++) 
     { 


      if (arrArr[j][0] > arrArr[j + 1][0]) 
      { 

       arrTmp = arrArr[j]; 
       arrArr[j] = arrArr[j + 1]; 
       arrArr[j + 1] = arrTmp; 
      } 

     } 
    } 
} 

它顯示了我一個錯誤關於`./program.o'自由 錯誤:雙重釋放或腐敗(出):0x0000000002316030 什麼我可以做的代碼,我在做什麼毛病免費?謝謝。

+0

'free(** arrArr);' - >'free(arrArr);' – StoryTeller

+2

看看最初的'malloc'調用。如果'sizeof(int)!= sizeof(int *)'(這很可能在64位系統上)會發生什麼? –

+0

爲第二個'free()'做和第一個一樣的工作。傳入分配函數('malloc()')返回的內容。這裏'int ** arrArr = ...''**'是變量類型的一部分。它不是它名字的一部分。 – alk

回答

1

將行free(**arrArr);更改爲free(arrArr);應解決問題。直接通過指針free()

arrArrint **類型:像二維數組

*arrArrint *類型:像一維數組

**arrArrint類型:只是一個整數

就像你不能打電話free(123),你不能全部free(**arrArr)

+0

我試過了,它的盜用不起作用 – MorByoseF

+0

@MorByoseF如果你有'**'指針,你需要一個foor循環來分配和釋放每個'*'poitner的內存,並且由於你是初學者,所以可能會有一些其他的錯誤這會導致未定義的行爲,直到調用'free()'時才觸發分段錯誤或其他內存相關的問題。但這個答案實際上應該解決這個問題,'free(arrArr)'。 –

+0

@MorByoseFI運行你的程序[這裏](https://ideone.com/LW57JP),還有一些其他的拼寫錯誤,我修好了,你可以看看。 – xhg

1

如果你閱讀文檔或標準規格,你會明白的free()

  • 傳遞到free()一個指針不是由malloc()/calloc()realloc()返回是不確定的行爲的基本特徵。

你走的更遠,並通過int類型,這又是另一個原因是未定義行爲的非指針值,因爲該程序將嘗試在一個無效的地址以釋放存儲是存儲在第一值陣列的位置arrArr

另外,請注意,我突出顯示指針上面。再次閱讀文檔將使您知道free()的簽名是

void free(void *); 

所以傳遞一個int應該產生這樣轉換警告整數到指針,未作鑄或相似。

還有一件事,如果你啓用編譯器警告,你可以從警告中學到很多關於c語言的東西,當然還有一些你自己的見解。如果你啓用了警告,那麼忽略它們是一個非常糟糕的信號,你應該認識到,作爲一個初學者會犯很多簡單的錯誤,警告會被警告,經驗豐富的程序員會在代碼中發現簡單的問題,如意外地分配比較兩個值。

因此,在總結,

  1. 使用任何功能之前,請先閱讀文檔。
  2. 不要忽略警告。