2017-06-11 11 views
-5

私はCで少し実験していますが、ポインタの周りに頭を抱えようとしていますが、以下の動作を理解できません。 s1が初期化されると、firstとlastはNULLに設定されます。しかしながら、これらの値は実行されるすべての他のステップと共に変化する。同じことがb1に起こります。 isbnは最初は123ですが、他の行ごとに値が変化します。私はここに何か基本的なものを見逃しているように見えますが、私はそれが何であるか理解できません。Cのポインタの次の動作を理解できません

#include <stdio.h> 

typedef struct bookStruct 
{ 
    int isbn; 
    struct bookStruct* nextBook; 
}book; 

typedef book* bookPtr; 

typedef struct listOfBooks 
{ 
    bookPtr first; 
    bookPtr last; 
}series; 

typedef series* seriesPtr; 

seriesPtr CreateSeries() 
{ 
    series s1; 
    s1.first = NULL; 
    s1.last = NULL; 
    return &s1; 
} 

bookPtr CreateBook(int bookIsbn) 
{ 
    book nx; 
    nx.isbn = bookIsbn; 
    nx.nextBook = NULL; 
    return &nx; 
} 

int AddFirstBook(seriesPtr seriesPointer, bookPtr bookPointer) 
{ 
    if (seriesPointer->first == NULL || seriesPointer->last == NULL) 
    { 
     seriesPointer->first = bookPointer; 
     seriesPointer->last = bookPointer; 
     return 1; 
    } 

    return 0; 
} 

int main() 
{ 
    seriesPtr s1 = CreateSeries(); 
    bookPtr b1 = CreateBook(123); 
    int i = AddFirstBook(s1, b1); 
    printf("%d", i); 
    getchar(); 
} 
+1

'return &s1;'スタックに一時的に作成されたオブジェクトへのポインタを返しています。これらのオブジェクトにメモリを割り当てるには、 'malloc()'を使う必要があります。 –

+1

'CreateSeries()'はローカル自動変数のアドレスを返します。これは範囲外では無効です。 – BLUEPIXY

+0

このように考えると、 'main'で' CreateSeries() '関数を呼び出すと、関数スタックと呼ばれるメモリの別のブロックが関数の実行のために予約されています。関数内にローカルに作成されたすべての変数が含まれています。関数が返ってくると、関数スタックは破棄され(再利用のために解放される)、 'CreateSeries()'の中で宣言された 's1'は、' main'の 'seriesPtr s1'への代入にはもはや利用できません。 'main'で' s1'を宣言し、そのアドレスをパラメータとして渡します。 'seriesPtr s1; CreateSeries(&s1); ' –

答えて

0

あなたは無効であるCreateSeries()CreateBook()series s1book nxローカル変数のアドレスを返しています。

関数内のローカル変数用に作成されたメモリは、関数が返されるとすぐに取り戻されます。そのメモリに読み書きしようとするとセグメンテーションエラーが発生する可能性があります。

上記オブジェクトのメモリを動的に(ヒープから)割り当てます。お試しください。

CreateSeries()でも賢明です。残りのコードは問題ありません。

関連する問題