c - 数组被不相关的函数更改

标签 c arrays

我遇到了一些奇怪的 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

最佳答案

您的索引超出了函数 carrycarry_in 的范围。 block 是 4,因此 4*block 是 16。因此 j 从 0 运行到 3,而 i 运行从 1 到 15。因此,4*j+i 可以大到 12+15 = 27,这比最大安全值 15 大得多。 p>

关于c - 数组被不相关的函数更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46869030/

相关文章:

C 错误的变量值

java - 数组列表+数据库+servlet+DAO

javascript - 使用 javascript 将单词数组与图像数组配对

javascript - 将整数拆分为 2 位数字并放入数组 Javascript

javascript - 根据驻留在 Json 数组中的对象的 Json 值获取 Json 键

c - 循环内的堆栈分配

c - 消耗指针是什么意思?

c++ - 为什么我不能使用 strerror?

c - 为什么不能在内核中使用科学记数法

c - 二维数组 += 1 给出负数