ошибка типа несовместимого указателя C - PullRequest
0 голосов
/ 18 ноября 2011

Итак, я пытаюсь реализовать кеш на C. Я включил очень уменьшенную версию своего кода.

Я получаю эту ошибку:

prog.c: In function ‘addtolist’:
prog.c:29: warning: assignment from incompatible pointer type
prog.c:40: warning: assignment from incompatible pointer type
prog.c: In function ‘main’:
prog.c:72: warning: assignment from incompatible pointer type

из этогоcode:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct node_
{
    char * word;
    int filenumber;
    struct node * next;
};
typedef struct node_ * node;

node createnode()
{
    node head;
    head = malloc(sizeof(struct node_));
    head->word = NULL;
    head->next = NULL;
    return head;
}

unsigned int addtolist(node head, char * word, unsigned int limit, int fileno)
{
    unsigned int templimit = limit;
    node temp;
    node temphead = head;
    while(temphead->next != NULL)
    {
            temphead = temphead->next;
    }
    temp = malloc(sizeof(struct node_));
    temp->word =(char*) malloc(strlen(word)+ 1);
    strcpy(temp->word, word);
    temp->next = NULL;
    temp->filenumber = fileno;
    templimit = templimit - (strlen(word) + 1) - sizeof(struct node_)- sizeof(int);
    printf("templimit is size %u\n", templimit);
    if (templimit < limit && templimit > 0)
    {
            temphead->next = temp;
            limit = limit - strlen(word) - 1 - sizeof(struct node_)- sizeof(int);
            return limit;
    }
    else
    {
            free(temp->word);
            free(temp);
            return 0;
    }
}


int main()
{
    node newlist = createnode();
    int i = 0;

    unsigned int limit = 65;
    unsigned int temp = limit;

    while(temp > 0 && temp <= limit)
    {
        temp = addtolist(newlist, "Hello", temp, i);
        i++;
        printf("new limit is - \t%u\nfilenumber is - \t%d\n", temp,i);

    }
    node ptr = newlist;
    while(ptr->next != NULL)
    {
            printf("node %d contains the word %s\n", ptr->filenumber, ptr->word);
            ptr = ptr->next;
    }
    return 1;
}

Честно говоря, я не могу понять, что я делаю неправильно ... Моя логика заключалась в том, что, поскольку я определял структуру своей структуры как указатель, после того как я создал структуру впамять, я мог бы легко пройти через следующий список.Где был недостаток в моей логике?

EDIT исходная проблема была исправлена ​​(я забыл подчеркивание в моем объявлении типа для struct node_ next;.

Теперь я 'У меня другая проблема: когда я пытаюсь пройтись по списку внизу моего кода, чтобы распечатать слова, содержащиеся в списке, я в основном не могу пройти по списку. Я продолжаю выводить:

templimit is size 43
new limit is -  43
filenumber is -     1
templimit is size 21
new limit is -  21
filenumber is -     2
templimit is size 4294967295
new limit is -  0
filenumber is -     3
node 0 contains the word (null)
node 0 contains the word Hello

Почему-то кажется, что моя программа не сохраняет мои изменения в моем списке в памяти после первой итерации. Есть идеи, что я делаю неправильно?

Еще раз, любая помощьБуду признателен, и спасибо.

Ответы [ 3 ]

4 голосов
/ 18 ноября 2011

Внутри вашего определения структуры у вас есть struct node без подчеркивания.

вам лучше иметь предварительную декларацию

typedef struct node node;

и затем объявите свою структуру

struct node {
 ...
 node *next;
};

нет необходимости иметь это подчеркивание и скрывать * в typedef. Это только позволяет легко все перемешать.

1 голос
/ 18 ноября 2011

Я думаю, что член структуры 'next' должен быть объявлен как (node_ *) тип.Как написано это в настоящее время (узел_ **)

1 голос
/ 18 ноября 2011

Строковые литералы "like this" имеют тип const char*, а не char*, потому что они неизменны.

Исправьте в своих декларациях значение const char*, и предупреждения исчезнут.

...