0

ポインターを使用しているときに、配列 A を編集すると C の配列 B に影響するという問題があります。私のコードは次のとおりです。

#include <stdio.h>
#include <stdlib.h>
#include "frac_heap.h"

#define ARRAYSIZE 10

fraction heap[][ARRAYSIZE] = {0};
block freeBlocks[][ARRAYSIZE] = {0};
int startingBlock = 0;

void init_Heap(){
    int x;
    for(x = 0; x < ARRAYSIZE; x ++){    

        block *currBlock = freeBlocks[x];
        currBlock->isFree = 1;  
    }
}



void dump_heap(){
    int x;
    for(x = 0; x < ARRAYSIZE; x ++){
        fraction* tempFrac = heap[x];
        printf("%d\t%d\t%d\n",tempFrac->sign, tempFrac->numerator, tempFrac->denominator);
    }   
}


fraction* new_frac(){
    fraction* testFraction = heap[0];
    return testFraction;
}




int main(){ 
    init_Heap();
    dump_heap();
    fraction *p1;
    p1 = new_frac();
    p1->sign = -1;
    p1->numerator  = 2; 
    p1->denominator = 3;
    dump_heap();    
   }

dump_heap() は、分数の符号、分子、分母とともにヒープの内容を出力するだけです。ただし、このコードを実行したときの出力は次のとおりです。

0   0   0
0   1   0
0   1   0
0   1   0
0   1   0
0   0   0
0   0   0
0   0   0
0   0   0
0   0   0

-1  2   3
0   1   0
0   1   0
0   1   0
0   1   0
0   0   0
0   0   0
0   0   0
0   0   0
0   0   0

分数配列の多数の分数の分子の場所に 1 があるのを参照してください。init_heap() への呼び出しを編集すると、これは起こりません。init_heap への呼び出しを編集すると、出力は次のようになります。

0   0   0
0   0   0
0   0   0
0   0   0
0   0   0
0   0   0
0   0   0
0   0   0
0   0   0
0   0   0

-1  2   3
0   0   0
0   0   0
0   0   0
0   0   0
0   0   0
0   0   0
0   0   0
0   0   0
0   0   0

どちらが正しい。私の質問は、init_heap で freeBlocks 配列を編集してアクセスしているだけなのに、init_heap が分数配列に影響を与えるのはなぜですか?

4

3 に答える 3

1

あなたの問題は、次の 2 つの定義にあると思います。

fraction heap[][ARRAYSIZE] = {0};
block freeBlocks[][ARRAYSIZE] = {0};

初期化子を 1 つしか指定しないため、それぞれが先頭の次元にサイズ 1 の配列を定義します。

int x;
for (x = 0; x < ARRAYSIZE; x ++){    

    block *currBlock = freeBlocks[x];
    currBlock->isFree = 1;  
}

このコードは、一度に 10 秒の 1 単位ずつ配列の配列を介してインデックスを作成していますblock(そして範囲を踏みにじっています)。 freeblocks[1]に割り当てられたスペースの終わりを超えていfreeblocksます。freeblocks[9]さらに制御不能です。

于 2013-04-10T06:35:31.797 に答える
1

配列を として宣言しないでくださいheap[][ARRAYSIZE]。特に、それらを使用しようとしている方法では意味がありません。代わりに、それらを として宣言しましたheap[ARRAYSIZE]

于 2013-04-10T06:34:52.173 に答える
1

あなたがそれらを使用している方法から、2Dではなく1D配列を意図してheapいるようです。freeBlocks

その場合は、次のとおりです。

fraction heap[][ARRAYSIZE] = {0};
block freeBlocks[][ARRAYSIZE] = {0};

なるべき

fraction heap[ARRAYSIZE] = {0};
block freeBlocks[ARRAYSIZE] = {0};
于 2013-04-10T06:35:05.730 に答える