2014-12-02 76 views
0

我正在嘗試使二維數組的功能,但不知何故,它不工作。代碼在這裏:C中的二維數組malloc - >錯誤?

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

int **multiTable (unsigned int xs, unsigned in ys) 

{ 
unsigned int i, j; 

int **table = int(**)malloc(xs * ys * sizeof(int*)); 
for(i = 0; i < ys; i++) 
{ 
    for(j = 0; j < xs; j++) 
    { 
     table[i][j] = j * i; 
    } 


} 
free(**table); 
return table; 


} 

所以首先,我還應該在malloc裏面添加行(xs)嗎?還是應該工作,如果我只與列一起工作? - >是這樣的:

int **table = int(**)malloc(ys * sizeof(int*)); 
+0

你不能在「一杆」中做到這一點。首先將內存分配給'table',然後將'table [i]'(s)分配給內存。 – 2014-12-02 12:31:04

+0

什麼是'返回'的東西,只是'免費'的一點? – 2014-12-02 12:34:06

回答

1

是不會作爲指針int **table的陣列的工作是不連續的,這是不等同於2D陣列table[a][b]

但是,如果您想使用單個malloc,則可以使用指向數組的指針。

int (*table)[xs] = malloc(ys * sizeof(*table)); 
for(int i = 0; i < ys; i++) 
{ 
    for(int j = 0; j < xs; j++) 
    { 
     table[i][j] = i; 
    } 
} 
free(table) ; 

並且在您的回電後將其釋放後不返回table

+0

注意,在某些編譯器上,xs必須是一個定義或一個常量。 – rcgldr 2014-12-02 12:36:28

+0

@rcgldr並非如此,編譯器與此無關。標準確實。 C99及以後版本擁有可變長度的數組(以及指向它們的指針)。 – 2501 2014-12-02 12:37:16

+1

即使使用C99,我也留下了印象,只有多維(或單個)維數組的第一維(或唯一)維可變。剩下的尺寸需要固定。例如twodarrray [var] [const1]或threedarray [var] [const1] [const2]。 – rcgldr 2014-12-02 12:40:29

1

看來你指的是以下

int ** multiTable(unsigned int xs, unsigned int ys) 
{ 
    unsigned int i, j; 

    int **table = malloc(ys * sizeof(int *)); 

    for (i = 0; i < ys; i++) 
    { 
     table[i] = malloc(xs * sizeof(int)); 
     for (j = 0; j < xs; j++) 
     { 
      table[i][j] = j * i; 
     } 
    } 

    return table; 
} 
0

'表' 是一個2-d指針。首先了解什麼是2D指針。指針是一種特殊類型的變量,用於存儲另一個變量的地址。所以2D指針是一個特殊的變量,它又被用來存儲指針變量的地址。

現在想象你有一個指針數組(不同1-D數組的基地址集合),它將存儲許多1-D數組的基地址。

爲了動態分配內存以此數組的指針需要聲明

table=(int**)malloc(sizeof(int*)*xs); 

現在你有與「XS」數目的元件的陣列,並且可以通過表[0],表訪問每個元件[1],表[2] ...等等,但這些數組都沒有分配內存。因此,你需要單獨使用一個像這樣的循環分配內存以各自爲陣的:

for(i=0;i<xs;i++) 
    table[i]=(int*)malloc(sizeof(int)*ys); 

所以,你過的所有程序變爲:

int **table; // table is a 2D pointer 

table=(int**)malloc(sizeof(int*)*xs); 
for(i=0;i<xs;i++) 
    table[i]=(int*)malloc(sizeof(int)*ys); 

for(i = 0; i < ys; i++) 
{ 
    for(j = 0; j < xs; j++) 
    { 
     table[i][j] = j * i; 
    } 
} 
return table; 

你不需要之前釋放陣列返回它。這樣做會讓你的指針「表」懸空指針仍指的是不再分配的內存,所以才返回「表」不聲明:

free(table); 

上面的語句會導致懸空沒有接入點的內存,ans是沒用的。這是內存積累時產生的內存泄漏問題,並且該內存不能通過程序訪問,並且無法重新定位用於其他目的,這種內存稱爲懸空內存。

+0

請不要施放'malloc'的結果。從C89開始,它不再是必要的,如果你沒有在範圍內聲明'malloc',它可以抑制一個有用的診斷。 – 2014-12-02 14:49:01