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