2014-09-25 32 views
1

我是新來的C.我有理解以下兩個Understading指針

int N = 16 
double (*XX)[2] = malloc(2*N*sizeof(double)); 

int N = 16 
double *XX[2] = malloc(2*N*sizeof(double)); 

如果我寫的第一個之間的差別難度是越來越編譯。但是,第二個是給出以下錯誤。請解釋一下

error: invalid initializer 

編輯:我也想問一下malloc在上面正確的情況下做了什麼?

回答

2

double (*XX)[2]是指向具有兩個double元素的數組的指針。

double *XX[2]是一個指向具有兩個double *元素的數組的指針。

malloc動態存儲器分配,例如:

char array_stack[2]; // 2 chars allocated on the stack (no need for free()) 
char *array_heap = malloc(2 * sizeof(char)); // 2 chars allocated on the heap 
// later... 
free(array_heap); // heap memory must be freed by user 

供參考:

char array_stack[2]; // this is nevertheless a pointer 
char *array = array_stack; // this works, because array_stack is a pointer to a char 

有關堆棧和堆的更多信息:Stack vs Heap

double *XX[2] = malloc(2*N*sizeof(double)); 

不起作用,因爲它需要兩個元素作爲初始值設定項。例如:

double _1, _2; 
double *XX[2] = {&_1, &_2}; 

如果你想要做這個使用malloc,你需要將其更改爲指向與雙指針數組是這樣的:在第一種情況下

double **XX = malloc(...); 
2

在這種情況下

double (*XX)[2] 

XX是指向2個雙打

在這種情況下陣列

double *XX[2] 

XX是2分的指針數組加倍

EDIT : 其他人已經解釋過malloc,但是用俗語說:用malloc y歐預約使用malloc在您的計算機上的內存量,然後存儲在存儲器中的值已使用malloc

+0

你能否也請在我的問題上添加關於'malloc'做什麼的答案 – 2014-09-25 12:28:53

0
  1. malloc會返回一個指向某些存儲位置(void*)保留。
  2. double (*XX)[2]一個指向雙精度數組的指針 - 沒問題:編譯器知道如何從void*轉換爲double*
  3. double *XX[2]雙指針數組(我更喜歡這樣寫double* XX[2]很容易,我明白,大家都在談論雙指針(S)) - 編譯器不知道從void*轉換雙指針陣列
0

XX只是一個指向具有兩個雙元素的數組的指針。因此「sizeof(XX)」只是4.

第二種情況: XX是一個數組名,其中包含兩個元素,其類型爲(double *)。 所以下面的代碼就可以了。 double * XX [2]; XX [1] = malloc(20 * sizeof(double));

0

第一個定義double (*XX)[2]定義了一個單值,這裏是一個指針。一個變量可以由一個值初始化,如= malloc(...)所返回。

第二個(double *XX[2])定義了一個數組。陣列初始器看起來像這樣= {<init value(s)>}