Ошибка компиляции gcc: cast указывает тип массива - PullRequest
13 голосов
/ 07 августа 2010

Следующий код является абсолютно действительным,

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

, но когда я компилирую следующую строку кода,

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

gcc говорит

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

кажется, они отлиты таким же образом.Почему второй получил сообщение об ошибке?


Как вы, ребята, сказали, "abc" - это указатель, который нельзя преобразовать в указатель.Итак, мой другой вопрос: почему

 char[] s = "abc";

действителен.Как работает приведенная выше строка кода при компиляции?

Ответы [ 4 ]

19 голосов
/ 07 августа 2010

Это допустимо, потому что выражение справа является составным литералом C99 , а не приведением:

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

Однако это недопустимо, потому что это cast-expression , не составной литерал.Как говорит GCC, вы не можете привести к типам массивов:

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

Вы можете исправить это, сделав правильный составной литерал - они обозначены фигурными скобками:

char *p = (char[]){"abc"};
0 голосов
/ 14 декабря 2015

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

Ответ: p является указателем на первый байтовый адрес массива, а не указателем типа массива.Любой массив должен быть инициализирован фигурными скобками {}, массив символов инициализируется следующим образом:

<code>char my_char_arr[3] = {'a','b','c'};
, но может быть инициализирован строкой
<code>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.

Теперь, если адрес адресаравен 0x10, а его размер равен 3 байта:

        ptr++;

дает адрес 0x13.ect, ect.

если вы берете массив из нескольких измерений, адреса выстраиваются в очередь.

#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;
}

с использованием указателя массива в качестве примера определения типа:

 #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;
  };
0 голосов
/ 07 августа 2010

Первый пример не приводит к созданию массива.И между char [] и char * существует огромная разница: первый - это сам массив, а второй - указатель на массив.Должно работать следующее (не уверен на 100%):

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

Или

char *p = &((char[]) "abc")[0];
0 голосов
/ 07 августа 2010

"abc" не может быть приведен к массиву char, так как это не массив для начала с

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...