gcc编译错误:cast指定数组类型

时间:2010-08-06 21:13:39

标签: c gcc

以下代码完全有效,

int *ia = (int[]){1,3,5,7};

但是当我编译下一行代码时,

char *p = (char[]) "abc";

gcc说

test.c:87: error: cast specifies array type

似乎它们以同样的方式铸造。为什么第二个得到一个错误的消息?


正如你们所说,“abc”是一个指针,它不能转换为指针。所以我的另一个问题是:为什么

 char[] s = "abc";

有效。上面的代码行在编译时如何工作?

5 个答案:

答案 0 :(得分:19)

这是有效的,因为右边的表达式是C99 复合文字,而不是演员:

int *ia = (int[]){1,3,5,7};

但是,这是无效的,因为它是 cast-expression ,而不是复合文字。正如GCC告诉你的那样,你不能转换为数组类型:

char *p = (char[]) "abc";

你可以通过使它成为一个合适的复合文字来修复它 - 它们用括号表示:

char *p = (char[]){"abc"};

答案 1 :(得分:2)

C11 6.5.2.5p3

  
      
  1. 由括号类型名称组成的后缀表达式,后跟括号括起来的初始化程序列表是复合文字。它提供了一个未命名的对象,其值由初始值设定项列表给出。
  2.   

(重点是我的)

即,输入括号(char []),后跟用括号括起来的初始化程序列表{ 'a', 'b', 'c', '\0' }

自第6段以来,

  
      
  1. 6.7.9中初始化程序列表的所有语义规则也适用于复合文字。
  2.   

而6.7.9p14说

  
      
  1. 可以通过字符串文字或UTF-8字符串文字来初始化字符类型的数组,可以选择将其括在大括号中。字符串文字的连续字节(如果有空间或数组大小未知,则包括终止空字符)将初始化数组的元素。
  2.   

您也可以使用(char []){ "abc" }达到相同的效果。请注意,尽管6.7.9p14允许从字符串而不用大括号初始化char的数组,但复合文字规则却否认了这一点,因为(char []) "abc"看起来就像 cast

答案 2 :(得分:0)

第一个例子没有强制它的数组创建。 char []和char *之间存在巨大的差异:第一个是数组本身,第二个是指向数组的指针。以下应该有效(不是100%肯定):

char *p = &((char[]) "abc");  

char *p = &((char[]) "abc")[0];

答案 3 :(得分:-1)

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 <stdlib.h>
#include <stdio.h>

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 <stdlib.h>
 #include <stdio.h>
 // 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;
  };

答案 4 :(得分:-2)

"abc"无法转换为char数组,因为它不是以

开头的数组