Erreur de compilation gcc: cast spécifie le type de tableau

Le code suivant est parfaitement valide,

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

mais quand je comstack la prochaine ligne de code,

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

gcc dit

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

Il semble qu’ils soient moulés de la même manière. Pourquoi le second a-t-il reçu un message d’erreur?


Comme vous l’avez dit, “abc” est un pointeur qui ne peut pas être converti en pointeur. Alors ma autre question: pourquoi

  char[] s = "abc"; 

est valable. Comment fonctionne la ligne de code ci-dessus lors de la compilation?

Ceci est valide car l’expression à droite est un littéral composé C99 et non une dissortingbution:

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

Toutefois, ceci n’est pas valide car il s’agit d’une expression cast , pas d’un littéral composé. Comme GCC vous le dit, vous ne pouvez pas transtyper en types de tableau:

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

Vous pouvez résoudre ce problème en en faisant un littéral composé correct – ils sont désignés par les accolades:

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

Le premier exemple n’indique pas sa création de tableau. Et il y a une différence énorme entre char [] et char *: le premier est le tableau lui-même et le second est un pointeur sur tableau. Ce qui suit devrait fonctionner (pas à 100% sûr):

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

Ou

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

char * p = (char) {“abc”};

Réponse: p est un pointeur sur l’adresse du premier octet du tableau, pas un pointeur de type tableau. Tout tableau doit être initialisé avec des accolades {} un tableau de caractères est initialisé comme ceci:

 char my_char_arr[3] = {'a','b','c'}; 

mais peut être initialisé avec une chaîne

 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. 

Maintenant, si l’adresse arr est 0x10 et que sa taille est de 3 octets, alors:

  ptr++; 

donne l’adresse 0x13. ect, ect.

si vous prenez un tableau à plusieurs dimensions, l’adresse est alignée.

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

en utilisant un pointeur de tableau comme exemple 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" ne peut pas être converti en tableau de caractères car ce n’est pas un tableau pour commencer