Хранить адрес динамического массива в c - PullRequest
1 голос
/ 09 марта 2010

Я пытаюсь сохранить адрес индекса динамического массива. Последняя строка этой функции дает ошибку указателя.

static struct sstor *dlist
struct node *ins_llist(char *data, struct llist *l) {
    struct node *p, *q;
    q = malloc((size_t)sizeof(struct node));
    if(q == NULL)
        return(NULL);
    if(ins_list(data, &dlist))
        return NULL;
    q->item = &(dlist->item[(dlist->sz)-1]); // Problem?
    ...}

Выделение списка

struct llist *init_llist(void) {
    struct llist *l;
    dlist = init_list(INITSZ);
    if(dlist == NULL)
        return(NULL);

Это мой узел

struct node {
    char **item;
    struct node *next;
    struct node *prev;
};

Это мой массив

struct sstor {
    int sz;
    int maxsz;
    char item[][1024];
};

Я все еще новичок в указателях. В строке ниже выдается ошибка: присвоение из несовместимого типа указателя

q->item = &(dlist->item[(dlist->sz)-1]);

Ответы [ 2 ]

2 голосов
/ 09 марта 2010

Предполагается, что вы выделите фактическую struct node для q, чтобы указать на ...

Ошибка «несовместимые типы указателей» возникает из-за того, что q->item имеет тип char ** (указатель на указатель на символ), а &(dlist->item[...]) имеет тип char (*)[1024] (указатель на массив из 1024 символов). Эти типы просто несовместимы (там - это фактического объекта "указатель на символ", на который q->item не может указывать).

Вы можете решить проблему двумя способами. Во-первых, изменив объявление struct node на следующее:

struct node {
  char (*item)[1024];
  struct node *next;
  struct node *prev;
};

Во-вторых, изменив объявление struct node на следующее:

struct node {
  char *item;
  struct node *next;
  struct node *prev;
 };

.. и изменив оператор присваивания следующим образом:

q->item = dlist->item[(dlist->sz)-1]; // No Problem!

(Первая альтернатива заставляет q->item указывать на весь массив, а вторая - на первый char в массиве. Перспективные заметят, что это указатели на одно и то же местоположение, но с разными типами Обычно вторая форма - это то, что вы хотите).

2 голосов
/ 09 марта 2010

char** не совпадает с char[][1024]

Попробуйте исправить структуру sstor следующим образом:

 struct sstor {
  int sz;
  int maxsz;
  char *item[1024];
 };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...