2016-11-06 33 views
0

我不明白爲什麼我要在free_memory函數內部發生分段錯誤。下面是程序:不能理解這個錯誤,同時釋放內存中的內存C

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

void allocate_memory (char **cells) 
{ 
    int i; 

    cells = (char **) malloc(9 * sizeof(char *)); 
    if (cells == NULL) 
    { 
     perror("Couldn't allocate memory"); 
     exit(1); 
    } 

    for (i = 0; i < 9; i++) 
    { 
     cells[i] = (char *) malloc(9 * sizeof(char)); 
     if (cells[i] == NULL) 
     { 
      perror("Couldn't allocate memory"); 
      exit(1); 
     } 

     memset(cells[i], 1, 9); 
    } 
} 

void free_memory (char **cells) 
{ 
    int i; 

    for (i = 0; i < 9; i++) 
    { 
     free(cells[i]); 
    } 

    free(cells); 
} 

int main (int argc, char *argv[]) 
{ 
    char **cells = NULL; 

    allocate_memory(cells); 
    printf("Allocated\n"); 
    free_memory(cells); 

    return 0; 
} 

調試器顯示該消息有關錯誤:

Process 1433 launched: '/Users/Jaime/Documents/workspaceC/PruebasC/PruebasC/sk' (x86_64) 
Allocated 
Process 1433 stopped 
* thread #1: tid = 0x1058a, 0x0000000100000e95 sk`free_memory + 37, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0) 
    frame #0: 0x0000000100000e95 sk`free_memory + 37 
sk`free_memory: 
-> 0x100000e95 <+37>: movq (%rcx,%rax,8), %rdi 
    0x100000e99 <+41>: callq 0x100000f20    ; symbol stub for: free 
    0x100000e9e <+46>: movl -0xc(%rbp), %eax 
    0x100000ea1 <+49>: addl $0x1, %eax 

我希望有人能幫助我,我不明白爲什麼我訪問一個壞的指針。

+0

(HTTP [從標準使用與fgets()讀取]的可能重複: //stackoverflow.com/questions/40412010/reading-from-stdin-using-fgets) –

回答

1

你是不是修改你的maincellsallocate_memory設置。您正在修改副本。

如果你想在一個函數修改的指針,你有一個指針到指針傳遞給函數:

... 

void allocate_memory (char ***cells) 
{ 
    int i; 

    *cells = (char **) malloc(9 * sizeof(char *)); 
    if (*cells == NULL) 
    { 
     perror("Couldn't allocate memory"); 
     exit(1); 
    } 

    for (i = 0; i < 9; i++) 
    { 
     (*cells)[i] = (char *) malloc(9 * sizeof(char)); 
     if ((*cells)[i] == NULL) 
     { 
      perror("Couldn't allocate memory"); 
      exit(1); 
     } 

     memset((*cells)[i], 1, 9); 
    } 
} 

...  

int main (int argc, char *argv[]) 
{ 
    char **cells = NULL; 

    allocate_memory(&cells); 

    ... 
} 
+0

謝謝!真的很好回答人:D –

0

C使用傳值傳遞函數參數。如果你想分配內存以cells本身,你需要或者

  • 指針傳遞給它,或
  • 收益新分配的指針,並將其存儲回cellsmain()

    否則,allocate_memory()函數中的cells函數是本地的,因爲一旦您從該函數返回,對cells所做的任何更改都將丟失。

其結果是,裏面free_memory()功能,接入cells[i]是無效的,因爲cells沒有指向任何有效的內存,在所有。嘗試訪問無效內存調用undefined behavior

0

分配函數不返回新分配的塊。 allocate_memory(cells);

外部效果就好像細胞沒有被功能(之前設置爲NULL)