2012-01-02 2 views
1

Я пытаюсь написать простой список. У меня есть следующий код:Указатели, списки и пустоты

#include "stdio.h" 
#include "stdlib.h" 

typedef struct _anObject { 
    void* data; 
    struct _anObject* previous; 
    struct _anObject* next; 
} object_t; 


typedef struct _aHead { 
    object_t* first; 
    object_t* current; 
    object_t* next; 
    object_t* last; 
    int index; 
    int size; 
} head_t; 

head_t* new_list(void) 
{ 
    head_t* list = malloc(sizeof(head_t)); 
    list->first = NULL; 
    list->current = NULL; 
    list->last = NULL; 
    list->index = -1; 
    list->size = 0; 
    return list; 
} 

void add_object_to_list(head_t* list, object_t* object) 
{ 
    if (list->size == 0) 
    { 
    object->next = NULL; 
    object->previous = NULL; 
    list->first = object; 
    list->current = object; 
    list->last = object; 
    list->index = 0; 
    list->size = 1; 
    } 
    else if (list->size > 0) 
    { 
    object->previous = list->last; 
    object->next = NULL; 
    list->current->next = object; 
    list->current = object; 
    list->last = object; 
    list->size +=1; 
    list->index = list->size - 1; 
    }  
} 

object_t* createIntObject(int value) 
{ 
    int* data = &value; 
    object_t* object = malloc(sizeof(object_t)); 
    object->data = data; 
    return object; 
} 

int main(int argc, char** argv) 
{ 
    head_t* list = new_list(); 
    object_t* obj; 
    obj = createIntObject(22); 
    add_object_to_list(list, obj); 
    obj = createIntObject(44); 
    add_object_to_list(list, obj); 

    fprintf(stderr, "size number: %i\n", list->size); 
    fprintf(stderr, "First data value on the list: %i\n", *(int*) list->first->data); 
    fprintf(stderr, "Last data value on the list: %i\n", *(int*) list->last->data); 

    free(list); 
    free(obj); 
    return 0; 
} 

I скомпилирован без какого-либо предупреждения или ошибок, но когда я запускаю код я получаю следующий и не хотел результат:

size number: 2 
Current data value on the list: 0 
Current data value on the list: 0 

Что я делаю не так? Любая помощь будет оценена

+1

Голосуйте, чтобы закрыть: Эта проблема может быть решена (или, по крайней мере, идентифицированный) с помощью пошагового кода в отладчике. –

ответ

5

Ошибка в createIntObject, где вы возвращаете указатель на параметр функции:

object_t* createIntObject(int value) { /* deobfuscated */ 
    object_t* object = malloc(sizeof(object_t)); 
    object->data = &value; // <-- 
    return object; 
} 

Доступ указатели на локальные переменные (включая параметры функции) после того, как функция вернула урожай неопределенные поведение. Вместо этого выделите пространство для целочисленного значения с помощью malloc и назначьте его object->data.

Это обычная ошибка начинающего. Для получения дополнительной информации см. reference question или local-variables tag.

Несколько других примечаний: Если вы используете printf и malloc, вы must#include <stdio.h> и #include <stdlib.h>.

Убедитесь, что ваш компилятор установлен для распознавания этих ошибок по умолчанию. Например, если вы абсолютно не уверены в внутренних компонентах компилятора и стандарте C, рекомендуется скомпилировать ваши программы с помощью gcc -std=c99 -pedantic -Wall -Werror.

Кроме того, успешная программа возвращает 0 по соглашению и код ошибки в противном случае.

3

Если это утешит (я сомневаюсь, если он есть), когда я скомпилировать код на MacOS X 10.7.2 с GCC 4.2.1 (LLVM), я получаю:

size number: 2 
First data value on the list: 22 
Last data value on the list: 44 

Все, что я сделал было добавлено <stdio.h> и <stdlib.h>, сделать функции статическими и объявить int main(void), поскольку аргументы не используются.

Итак, почему бы вам не увидеть это?

  • Подумайте, где это значение сохраняется, когда вы берете его адрес в createIntObject().

Также, когда вы создаете объект, вы должны установить ссылки на NULL - убедитесь, что вы полностью инициализируете объект.

0

Этот код работает хорошо

object_t* createInt(int value) 
{ 
    object_t* object = malloc(sizeof(object_t)); 
    object->data = malloc(sizeof(int)); 
    *(int*)object->data = value; 
    object->next = NULL; 
    object->previous = NULL; 
    return object; 
} 
Смежные вопросы