在c中存储地址动态数组

时间:2010-03-09 01:58:56

标签: c data-structures pointers

我正在尝试保存动态数组索引的地址。该函数的最后一行是指针错误。

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?
    ...}

dlist的分配

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 个答案:

答案 0 :(得分:2)

char**char[][1024]

不同

尝试修复sstor结构,如下所示:

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

答案 1 :(得分:2)

假设您为struct node分配实际q以指向...

出现“不兼容的指针类型”错误,因为q->item具有类型char **(指向char的指针),&(dlist->item[...])具有类型char (*)[1024](指针)到一个1024 char的数组)。这些类型根本不兼容(没有实际的“指向char的对象”指针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。明确指出这些是指向同一位置的指针,但是有不同的类型。通常,第二种形式是你想要的。