指针,列表和空白

时间:2012-01-02 22:42:22

标签: c list pointers void-pointers

我正在尝试写一个简单的列表。我有下一个代码:

#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

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

3 个答案:

答案 0 :(得分: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,否则返回错误代码。

答案 1 :(得分:3)

如果有任何安慰(我怀疑是否),当我使用GCC 4.2.1(LLVM)在MacOS X 10.7.2上编译代码时,我得到:

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 - 确保完全初始化对象。

答案 2 :(得分: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;
}