2017-10-21 5 views
0

奇妙なCの動作が発生しました。私は一見無関係な関数呼び出しの後に変更されている配列(SHOULD_NOT_CHANGEというラベルが付けられている)を持っています。私の配列はグローバルではなく、関数呼び出しには特定の配列が含まれていません。誰かが何が起こっているか把握できれば、私は大いに感謝するでしょう。ここでの主である:ここでは関連のない関数で配列が変更されました

int main(){ 




    int generate4[16] = {0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; 
    int propagate4[16] = {0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0}; 

    int SHOULD_NOT_CHANGE[4] = {0, 1, 0, 0}; 

    int carry_in16[4] = {1,2,1,1}; 
    int carry_in4[16] = {0}; 



    printf("\nShould be 1: %d", SHOULD_NOT_CHANGE[0]); 
    printf("\nShould be 0: %d", SHOULD_NOT_CHANGE[1]); 

    printf("\nSHOULD NOT CHANGE : "); 
    print_binary_array(SHOULD_NOT_CHANGE, 4); 



    // Here is where the problem is 
    carry(propagate4, generate4, carry_in4, carry_in16, 64, 4); 



    printf("\n\nShould be 0: %d", SHOULD_NOT_CHANGE[0]); 
    printf("\nShould be 1: %d", SHOULD_NOT_CHANGE[1]); 

    printf("\nSHOULD NOT CHANGE : "); 
    print_binary_array(SHOULD_NOT_CHANGE, 4); 

    return 0; 
} 

は犯人機能である:

void carry(int* p, int* g, int* carry_in, int* group_carry, int size, int block) 
{ 

for (int j = 0; j < block; j++){ 
    carry_in[j] = g[j] + p[j] * group_carry[j]; 

    for (int i = 1; i < block*4; i++){ 
     carry_in[4*j+i] = g[4*j+i] + p[4*j+i] * group_carry[j]; 
    } 
} 
} 

そして、ここでは私の出力です:

Should be 0: 0 
Should be 1: 1 
SHOULD NOT CHANGE : 0010 

Should be 0: -13136 
Should be 1: 0 
SHOULD NOT CHANGE : 1-21471898220-13136 
+0

'carry_in [4 * j + i]' - これはmaxで 'carry_in [4 * 3 + 15]'と評価されます。これは、配列の終りを読み込み、セグメンテーションは保証されません)。 –

+0

@KarlReid OPがそれを受け入れることができるように、あなたのコメントを回答として投稿してください。 –

答えて

1

あなたが機能carrycarry_inの境界を越えてインデックス化されています。 blockが4であるので、4*blockは16です。したがって、jは0〜3で実行され、iは1〜15で実行されます。4*j+iは、12 + 15 = 27と大きくなります。ウェイは最大安全値15.

+0

ありがとう!私はforループを修正し、問題を修正しました。 – charge3

関連する問題