gcc编译错误:cast指定数组类型
以下代码完全有效,
int *ia = (int[]){1,3,5,7};
但是当我编译下一行代码时,
char *p = (char[]) "abc";
gcc说
test.c:87: error: cast specifies array type
它们似乎以同样的方式铸造。 为什么第二个得到一个错误的消息?
正如你们所说,“abc”是一个指针,它不能转换为指针。 所以我的另一个问题是:为什么呢
char[] s = "abc";
已validation。 上面的代码行在编译时如何工作?
这是有效的,因为右侧的表达式是C99 复合文字 ,而不是强制转换:
int *ia = (int[]){1,3,5,7};
但是,这是无效的,因为它是一个强制转换表达式 ,而不是复合文字。 正如GCC告诉你的那样,你不能转换为数组类型:
char *p = (char[]) "abc";
你可以通过使它成为一个合适的复合文字来修复它 – 它们用大括号表示:
char *p = (char[]){"abc"};
第一个例子不是它的数组创建。 char []和char *之间存在巨大的差异:第一个是数组本身,第二个是指向数组的指针。 以下应该工作(不是100%肯定):
char *p = &((char[]) "abc");
要么
char *p = &((char[]) "abc")[0];
char * p =(char){“abc”};
答案:p是指向数组的第一个字节地址的指针,而不是数组类型指针。 任何数组都需要用大括号{}初始化一个char数组初始化如下:
char my_char_arr[3] = {'a','b','c'};
但可以用字符串初始化
char my_char_arr[3] = {"abc"};
char arr[3] = {"abc"}; // a char array with 3 bytes. char (*ptr)[3]; // a char array type pointer. arr size and ptr size needs to be equal. (= 3) ptr = arr; // sets array address to array pointer.
现在,如果arr地址是0x10并且其大小是3个字节,那么:
ptr++;
给出地址0x13。 等,等。
如果您采用多维数组,那么地址就会排成一行。
#include #include int main(){ int i = 0; /* first example. */ char arr[3][9] = { // double dimensional array. { "Hello"}, { "Welcome"}, { "Good bye."}, }; char (*ptr)[9]; // array pointer. ptr = arr; // assign array to pointer. for( ; i < 3 ; i++ ){ // print memory address, and array value. printf("%p *(ptr + ) : %s \n", (*ptr), (*ptr)); // jump to next array = current memory address + 9. ptr++; } printf(" ======================= \n"); char second_arr[8] = { 'W','e','l','c','o','m','e'}; char (*second_ptr)[8]; // array pointer. second_ptr = &second_arr; // assign array to pointer with address operator &. printf("memory address: %p txt: %s \n", (*second_ptr), (*second_ptr)); printf(" ======================= \n"); for(i = 0 ; i < 7 ; i++ ){ // print memory address, and array value. printf("%p : %c \n", (*second_ptr), (*second_ptr)[i]); } return 0; }
使用数组指针作为typedef示例:
#include #include // second example. // //*** Typedef a array pointer *** // int i = 0, ERROR = 1, CRASH = 5, GOOD = 6, BUG = 8; char succes_text[3][60] = { {"Awesome performance detected !!\n"}, {"Your system and program are performing a expected.\n"}, {"No problems detected, proceeding next task.\n"} }; char error_text[3][60] = { {"Undefined error detected, call the help-desk.\n"}, {"Warning, bad algorithmic behavior.\n"}, {"Program manager found a bug, save your work.\n"} }; typedef char (*SUCCES_TEXT_TYPE)[60]; SUCCES_TEXT_TYPE SUCCES_TEXT = succes_text; typedef char (*ERROR_TEXT_TYPE)[60]; ERROR_TEXT_TYPE ERROR_TEXT = error_text; char * testfunc(int i, SUCCES_TEXT_TYPE s_txt, ERROR_TEXT_TYPE e_txt){ if(i == ERROR){ return (*e_txt);} if(i == CRASH){ e_txt += 1; return (*e_txt);} if(i == BUG){ e_txt += 2; return (*e_txt);} if(i == GOOD){ return (*s_txt);} return ""; } int main(){ for(;i < 10; i++){ printf("%s",testfunc(i, SUCCES_TEXT, ERROR_TEXT)); } return 0; };
"abc"
无法强制转换为char数组,因为它不是一个以数组开头的数组