2013-02-18 5 views
-2

Я пытаюсь определить функцию, которая вернет указатель на структуру. Я думаю, что я правильно это сделал (Returning a struct pointer), но мой код продолжает жаловаться на это сообщение об ошибке, когда я пытаюсь получить доступ к элементам указателя, «ошибка: разыменовать указатель на неполные типы».Возвращение указателя на структуру

Вот мой код

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

struct lnode 
{ 
    char* word; 
    int line; 
    int count; 
    struct lnode* nn;  /* nn = next node */ 
}; 

struct lnode* newNode (char* word, int line) 
{ 
    struct lnode* newn = (struct lnode*) malloc(sizeof (struct lnode)); 
    if (!newn) 
    return NULL; 
    strcpy (newn->word, word); 
    newn->line = line; 
    newn->count = 1; 
    newn->nn = NULL; 
    return newn; 
} 

int main() 
{ 
    char* p = "hello"; 
    struct lnode* head = newNode (p, 5); 
    //the following lines are causing errors 
    assert (!strcmp (head->word, p));  
    assert (head->line == 5); 
    assert (head->count == 1); 
    assert (!head->nn); 
    return 0; 
} 

Спасибо за помощь!

+1

У меня есть ощущение, что STH еще неправильно ... –

+4

кода вы показываете не совсем как у вас есть код. Структура 'lnode', скорее всего, определена в некоторых других ТУ. –

+3

Вы захотите выделить память для 'word'. Ваш 'strcpy' собирается бомбить, как только вы сможете запустить это. И да, пожалуйста, покажите реальный код. Этот код кажется поддельным. Всегда разочаровывает встреча с поддельным кодом. –

ответ

1

Код должен иметь доступ к структуре struct lnode.

As Alok Save намекает, что вы, вероятно, имеете объявление в другом файле (возможно, заголовок), и вы забыли его #include.

2

Помимо очевидной проблемы, которую вы пропустили, чтобы включить stdlib.h, существует также проблема с тем, как вы обрабатываете строки.

В C вы (да, вы) должны управлять всей памятью, которую вы используете для строк. Это включает в себя память, на которую указывает член word.

Вы код выполняет следующие действия (после удаления некоторых пуха):

struct lnode* newn = malloc(...); 
strcpy (newn->word, word); 

Здесь newn->word не инициализирован, так что это, скорее всего, рухнет.

Вам нужно будет выделить память для хранения строки, например, вызвав malloc() во второй раз:

struct lnode* newn = malloc(...); 
newn->word = malloc(strlen(word) + 1); 
strcpy (newn->word, word); 
Смежные вопросы