Ошибка компиляции 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";
. Как работает эта строка кода при компиляции?
Ответы
Ответ 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, поскольку он не является массивом, начинающимся с