C: несовместимые типы? - PullRequest
       35

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

0 голосов
/ 02 марта 2011
#include <stdlib.h>
#include <stdio.h>

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]. Любое понимание?

Ответы [ 3 ]

9 голосов
/ 02 марта 2011

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

f.baz=qux;

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

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

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

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

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

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

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

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

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

3 голосов
/ 02 марта 2011

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

int i;
for (i = 0; i < 6; ++i)
    f.baz[i] = qux[i];
0 голосов
/ 02 марта 2011

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

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

struct foo{
    char **baz;
};

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

f.baz=qux;
...