1

OK、これは構造体の定義です:

typedef struct {
   int first;
   int last;
   int count;
   char * Array [50];
} queue;

そして、別の関数を使用して初期化します

void initialize(queue * ptr){
   ptr=malloc(sizeof(queue));
   ptr->first=0;
   ptr->last=0;
   ptr->count=0;
}

次に、printf を使用して、first、last、count を出力します。3 つすべてがゼロである必要があります。しかし、実際に得られるのは、カウントは予想どおり0ですが、最初と最後は2つの非常に大きな奇妙な数字であり、プログラムを実行するたびに変化します。ここで何が問題なのか誰か教えてもらえますか? ありがとうございました。

4

3 に答える 3

6

ポインターを値で渡しています。関数は受け取った引数のコピーを変更しますが、呼び出し元のポインターは変更されておらず、おそらく初期化されていません。

queue**初期化するポインターのアドレスを受け取り、渡すように関数を変更する必要があります。

または、ポインタを引数として渡す代わりに、ポインタを返すこともできます。これはより単純なアプローチです。

于 2012-04-27T22:33:26.673 に答える
3

与えられた:

void initialize(queue * ptr);

次のように渡します。

queue q; // caller allocates a queue
initialize(&q);
// now q is initialized

また、呼び出し元によって割り当てられます。malloc しないでください。

// bad
void initialize_bad(queue * ptr){
   ptr=malloc(sizeof(queue)); << nope. already created by the caller. this is a leak
   ptr->first=0;
   ptr->last=0;
   ptr->count=0;
}

// good
void initialize_good(queue * ptr){
   ptr->first=0;
   ptr->last=0;
   ptr->count=0;
   // ptr->Array= ???;
}

malloc を使用する場合は、次のアプローチを使用して新しい割り当てを返すことを検討してください。

queue* NewQueue() {
   // calloc actually works in this case:
   queue* ptr = (queue*)calloc(1, sizeof(queue));
   // init here
   return ptr;
}

最終的に「間違っている」のは、実装がポインタを値で渡し、ポインタを新しい malloc された割り当てにすぐに再割り当てし、必要に応じて malloc された領域を初期化し、引数を変更せずにリークを導入することです。

于 2012-04-27T22:35:33.147 に答える
0

問題を修正するプログラムへの最小の変更は次のとおりです。

void initialize(queue * * pptr) {
    queue * ptr;
    ptr=malloc(sizeof(queue));
    if (ptr) {
        ptr->first=0;
        ptr->last=0;
        ptr->count=0;
    }
    /* The assignment on the next line assigns the newly allocated pointer
       into memory which the caller can access -- because the caller gave
       us the address of (i.e. pointer to) such memory in the parameter
       pptr. */
    *pptr = ptr;
}

最も重要な変更はqueue **、初期化関数に a を渡すことです。そうしないと、 を呼び出すときに実パラメータとして提供されたのコピーを変更することになります。ポインターにポインターを渡すことにより、呼び出し元にポインターを格納する元の変数にアクセスできます。queue *initialize()

NULL私は我慢できず、からの返品のチェックも追加しましたmalloc()。それはあなたの問題に対処しませんが、それを行わなかったコードを投稿することはできませんでした。

于 2012-04-27T22:56:21.427 に答える