C: Несовместимые типы?

#include  #include  struct foo{ int id; char *bar; char *baz[6]; }; int main(int argc, char **argv){ struct foo f; f.id=1; char *qux[6]; f.bar=argv[0]; f.baz=qux; // Marked line return 1; } 

Это всего лишь некоторый тестовый код, поэтому игнорируйте, что qux фактически не имеет ничего полезного в нем.

Я получаю сообщение об ошибке помеченной строки, incompatible types when assigning to type 'char *[6]' from type 'char **' но обе эти переменные определены как char *[6] в коде. Любое понимание?

    Проблема с этим кодом заключается в том, что строка

     f.baz=qux; 

    Пытается назначить массив qux массиву baz . В C массивы не являются переменными и не могут быть назначены новые значения. Чтобы увидеть более простой пример, этот код:

     int arr1[10], arr2[10]; arr1 = arr2; // Error! 

    Это незаконно, потому что вторая строка пытается присвоить второму массиву значение первого, которое не разрешено в C.

    Чтобы исправить это, вы, вероятно, захотите написать явный цикл, чтобы скопировать элементы, как показано здесь:

     int i; for (i = 0; i < 6; ++i) f.baz[i] = qux[i]; 

    Это законно, потому что каждый отдельный элемент массива является char * , который может быть назначен.

    Иногда вы также видите memcpy используемый для назначения массивов:

     memcpy(f.baz, qux, sizeof f.baz); 

    Это копирует по необработанным байтам всех полей в массивах.

    Вы не можете копировать такие массивы в C. Вы должны копировать их поэтапно:

     int i; for (i = 0; i < 6; ++i) f.baz[i] = qux[i]; 

    В C вы непосредственно назначаете физическую память. Вы можете указать на память в 8, 16, 32 или 64 бит в то время. Назначение массива должно выполняться равными частями, которые соответствуют тем возможным участкам, на которые вы можете указать.

    Если вам нужно указать несколько таких массивов в разное время, вы можете сделать:

     struct foo{ char **baz; }; 

    Это должно позволить вам изменить массив, на который указывают так, как вы это делали:

     f.baz=qux;