我已經聲明定義了指針數組作爲分配存儲器的指針數組用C
char (*c)[20]
當使用malloc分配存儲器
c=malloc(sizeof(char)*20);
或
c=(char*)malloc(sizeof(char)*20);
我得到作爲「可疑指針轉換」的警告
爲什麼?
我已經聲明定義了指針數組作爲分配存儲器的指針數組用C
char (*c)[20]
當使用malloc分配存儲器
c=malloc(sizeof(char)*20);
或
c=(char*)malloc(sizeof(char)*20);
我得到作爲「可疑指針轉換」的警告
爲什麼?
在此聲明
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]
類型之間沒有隱式轉換。編譯器必須(至少)警告。
首先,確保你有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數組。
因爲您將C定義爲指向靜態chars數組的指針,而不是指向chars數組的指針,即指向第一個char的指針。
變化
char (*c)[20];
爲
char * c;
一個
不,'c'被定義爲一個指向20個char的數組的指針。 「char」指針數組將沒有parens。 – 2012-01-16 15:37:46
@丹尼爾謝謝你,我編輯過。 – Gabriel 2012-01-16 18:15:27
爲20個字符數組,計數NUL終止,你並不需要一個指針
char array[20];
的字符指針,你不需要一個數組
char *pointer;
字符指針可以指向數組
pointer = array;
到所述陣列的部分(假設沒有「有趣」的業務與NUL叔minator)
pointer = &array[10];
或與malloc的
pointer = malloc(20);
分配一串字節只是使用如
c=(char(*)[20])malloc(sizeof(char)*20);
原因:
1中,作爲所述@ouah。
2,在K & R風格的編譯器,上面的一個是有效的和預期的。
你爲什麼要在那裏使用malloc? 'c'已經被初始化,因爲它是一個數組。 – 2012-01-16 15:25:39
如果你只是想要一個指向20個char的指針,你可能只想'char * c = malloc(20);'。 – 2012-01-16 15:27:24
不,使用(c)的大小獲取指針大小 – Akash 2012-01-16 15:27:32