2012-01-02 70 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; 
} 

我没有任何警告或错误编译,但是当我运行的代码我获得下一个,而不是想要的结果:

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

我到底做错了什么?任何帮助将不胜感激

+1

投票关闭:这个问题可以通过在调试器中单步执行代码来解决(或者至少标识)。 – 2012-01-02 22:43:46

回答

5

的错误是在createIntObject,在那里你返回一个指针的函数参数:

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

访问指向局部变量(包括函数参数)一旦函数返回的产量不确定行为。相反,请使用malloc为整数值分配空间,然后将其分配给object->data

这是一个常见的初学者错误。有关更多信息,请参阅reference questionlocal-variables tag

一对夫妇的其他注意事项:如果您使用printfmalloc,你must#include <stdio.h>#include <stdlib.h>

确保您的编译器设置为默认识别这些错误。例如,除非你完全确定编译器内部结构和C标准,否则用gcc -std=c99 -pedantic -Wall -Werror编译程序是个好主意。

另外,一个成功的程序按惯例返回0,否则返回一个错误代码。

3

如果它是任何安慰(我怀疑它是),当我在Mac OS 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; 
}