Подтвердить что ты не робот

Ошибка компиляции 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";

. Как работает эта строка кода при компиляции?

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

Или

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

Ответ 3

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

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

char my_char_arr[3] = {'a','b','c'};
but can be initialized with a string
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.

Now if arr address is 0x10 and its size is 3 bytes then:

        ptr++;

gives address 0x13. ect, ect.

if you take a multiple dimensions array the the address are lined up.

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

using an array pointer as a typedef example:

 #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

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