2012-01-02 5 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 

私が間違っているのは何を?

関数が未定義の利回りを返した後(関数のパラメータを含む)ローカル変数へのポインタへのアクセス
object_t* createIntObject(int value) { /* deobfuscated */ 
    object_t* object = malloc(sizeof(object_t)); 
    object->data = &value; // <-- 
    return object; 
} 

:すべてのヘルプは、エラーがあなたが関数のパラメータへのポインタを返すcreateIntObject、である

+1

投票に動作します。 –

答えて

5

を理解されるであろう動作。代わりに、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

それはどんな慰め(それがある場合、私は疑問だ)、私はGCC 4.2.1とMacOS Xの10.7.2(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; 
} 
関連する問題