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数组,因为它不是一个以数组开头的数组