2012-01-16 77 views
1

我已經聲明定義了指針數組作爲分配存儲器的指針數組用C

char (*c)[20] 

當使用malloc分配存儲器

c=malloc(sizeof(char)*20); 

c=(char*)malloc(sizeof(char)*20); 

我得到作爲「可疑指針轉換」的警告

爲什麼?

+2

你爲什麼要在那裏使用malloc? 'c'已經被初始化,因爲它是一個數組。 – 2012-01-16 15:25:39

+1

如果你只是想要一個指向20個char的指針,你可能只想'char * c = malloc(20);'。 – 2012-01-16 15:27:24

+0

不,使用(c)的大小獲取指針大小 – Akash 2012-01-16 15:27:32

回答

5

在此聲明

char (*c)[20];

c objec t的型號爲char (*)[20]

我們知道在C malloc返回類型是void *並且void *到任何對象指針類型之間存在隱式轉換。

所以c = malloc(whatever_integer_expression)在C中是有效的。如果您收到警告,您可能正在使用C++編譯器,或者您正在使用C編譯器,但忘記包含stdlib.h標準標頭。

但是c = (char*) malloc(whatever_integer_expression)無效C因爲char *類型和char (*)[20]類型之間沒有隱式轉換。編譯器必須(至少)警告。

1

首先,確保你有stdlib.h包括在內。

其次,嘗試重寫它作爲

c = malloc(sizeof *c); 

我懷疑你得到診斷的第二種情況,因爲char *char (*)[20]不兼容的類型。不知道爲什麼第一個案件會抱怨(無論如何,在編譯時),除非你沒有包含stdlib.h

編輯

請記住,你將不得不取消引用指針應用前標;也就是說,你的表情會是

(*c)[i] = val; 
printf("%c", (*c)[j]); 

或者你可以代替(*c)[i]c[0][i],但是這可能如果c是不是應該像一個2撲朔迷離-d數組。

2

因爲您將C定義爲指向靜態chars數組的指針,而不是指向chars數組的指針,即指向第一個char的指針。

變化

char (*c)[20]; 

char * c; 

一個

+0

不,'c'被定義爲一個指向20個char的數組的指針。 「char」指針數組將沒有parens。 – 2012-01-16 15:37:46

+0

@丹尼爾謝謝你,我編輯過。 – Gabriel 2012-01-16 18:15:27

0

爲20個字符數組,計數NUL終止,你並不需要一個指針

char array[20]; 

的字符指針,你不需要一個數組

char *pointer; 

字符指針可以指向數組

pointer = array; 

到所述陣列的部分(假設沒有「有趣」的業務與NUL叔minator)

pointer = &array[10]; 

或與malloc的

pointer = malloc(20); 
0

分配一串字節只是使用如

c=(char(*)[20])malloc(sizeof(char)*20); 

原因:

1中,作爲所述@ouah。

2,在K & R風格的編譯器,上面的一個是有效的和預期的。