Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 由无关函数更改的数组_C_Arrays - Fatal编程技术网

C 由无关函数更改的数组

C 由无关函数更改的数组,c,arrays,C,Arrays,我正在经历一些奇怪的C行为。我有一个数组,我已经标记为“不应该改变”,它在一个看似无关的函数调用后正在改变。我的数组不是全局数组,函数调用不包括特定数组。如果有人能知道发生了什么,我将不胜感激。主要内容如下: 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 S

我正在经历一些奇怪的C行为。我有一个数组,我已经标记为“不应该改变”,它在一个看似无关的函数调用后正在改变。我的数组不是全局数组,函数调用不包括特定数组。如果有人能知道发生了什么,我将不胜感激。主要内容如下:

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];
    }
}
}

您正在索引超出函数carry中carry_的边界。block是4,所以4*block是16。所以j从0到3,我从1到15。因此,4*j+i可以大到12+15=27,这远大于最大安全值15。

carry_in[4*j+i]-这将计算为carry_in[4*3+15]的最大值,这意味着您将读取数组的末尾,导致未定义的行为segfault不能保证。@KarlReid请将您的评论作为答案发布,以便OP可以接受。谢谢!我修复了for循环,它修复了我的问题。
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