Arrays 更新函数内部的二维数组

Arrays 更新函数内部的二维数组,arrays,c,multidimensional-array,Arrays,C,Multidimensional Array,我一直试图通过将2d数组作为参数传递给函数来更新它,但我似乎不理解它是如何工作的,我在下面展示了一个示例,它工作正常,它更新了值 void substitution_sbox(uint8_t a[4][4]) { int index1, index2; for(int i=0;i<4;i++){ for(int j=0;j<4;j++){ index1 = a[i][j] >> 4; inde

我一直试图通过将2d数组作为参数传递给函数来更新它,但我似乎不理解它是如何工作的,我在下面展示了一个示例,它工作正常,它更新了值

void substitution_sbox(uint8_t a[4][4]) {
      int index1, index2;
      for(int i=0;i<4;i++){
        for(int j=0;j<4;j++){
          index1 = a[i][j] >> 4;
          index2 = a[i][j] & 0x0f;
          printf("index[1]: %x and index[2]: %x\n", index1, index2);
          a[i][j] = g_aes_sbox[index2 + (16 * index1)];
          // g_aes_sbox[] is a globally defined array.
        }
      } 
  }

uint8_t plain_text[4][4] = { {0x32, 0x43, 0xF6, 0xA8}, {0x88, 0x5A, 0x30, 0x8D}, {0x31, 0x31, 0x98, 0xA2}, {0xE0, 0x37, 0x07, 0x34} };
//after calling substitution from here..
// SUBSTITUTION.
    printf("calling substitution\n");
    substitution_sbox(plain_text);
    // this function when printing, updates the array correctly.
现在,如果我尝试在另一个函数中调用相同的数组,它不会像我所想的那样更新-

void row_shift(uint8_t a[4][4]) {
   for(int i=1;i<4;i++){
      for(int j=0;j<4;j++){
        // rotate this row by i positions, to the left.
        
        // m = no. of rotations.
        for(int m=0;m<i;m++) {
            // rotate by one.
            uint8_t temp = a[i][0];
            for(int n=0;n<4;n++) {
                a[i][n] = a[i][n+1];
            }
            a[i][3] = temp;
            
            // rotate by one
        }   
        

        for(int g=0;g<4;g++) printf("%04x ",a[i][g]); 
        printf("\n");
     }
   }
}
此函数不会更改数组,数组保持不变,是否有人可以帮助我了解在这两种情况下更新是如何工作的? 多谢各位

在这两种情况下,更新是如何工作的

在替换方面无法帮助您,因为关于g_aes_sbox的一切都是未知的

不管怎样,你为什么要做这么复杂的事情

  index1 = a[i][j] >> 4;
  index2 = a[i][j] & 0x0f;
  ...
  a[i][j] = g_aes_sbox[index2 + (16 * index1)];
而不是

a[i][j] = g_aes_sbox[a[i][j]];
因为a是uint8的数组,index2+16*index1的值是a[i][j]&0x0f+16*a[i][j]>>4是a[i][j]

此函数不会更改数组,数组保持不变

首先,您有一个未定义的行为:

for(int n=0;n<4;n++) {
    a[i][n] = a[i][n+1];
}
当i和n值为3时,将[3][3]与数组外的[3][4]赋值,则行为未定义

碰巧,未定义的行为可能没有明显的影响,并且您在[i][3]=temp之后取消了错误的赋值

正确的方法是测试n 在这两种情况下,更新是如何工作的

在替换方面无法帮助您,因为关于g_aes_sbox的一切都是未知的

不管怎样,你为什么要做这么复杂的事情

  index1 = a[i][j] >> 4;
  index2 = a[i][j] & 0x0f;
  ...
  a[i][j] = g_aes_sbox[index2 + (16 * index1)];
而不是

a[i][j] = g_aes_sbox[a[i][j]];
因为a是uint8的数组,index2+16*index1的值是a[i][j]&0x0f+16*a[i][j]>>4是a[i][j]

此函数不会更改数组,数组保持不变

首先,您有一个未定义的行为:

for(int n=0;n<4;n++) {
    a[i][n] = a[i][n+1];
}
当i和n值为3时,将[3][3]与数组外的[3][4]赋值,则行为未定义

碰巧,未定义的行为可能没有明显的影响,并且您在[i][3]=temp之后取消了错误的赋值

正确的方法是测试n数组实际上是在函数row_shift中更改的,只是每行旋转4倍。因为每一行的长度为4,所以最终的效果是该行看起来没有变化,即

第0行未旋转。 第1行旋转4次4*1。 第2行旋转8次4*2。 第3行旋转12次3*4。 第一个嵌套循环

for(int j=0;j<4;j++){
    ....
}
我想这就是问题所在。如果删除该选项,您将发现行分别旋转了0、1、2和3次

除此之外,还有一个bug,它通过数组上的越界访问来识别。你也必须解决这个问题。

数组实际上是在函数row\u shift中更改的,只是每行旋转了4倍。因为每一行的长度为4,所以最终的效果是该行看起来没有变化,即

第0行未旋转。 第1行旋转4次4*1。 第2行旋转8次4*2。 第3行旋转12次3*4。 第一个嵌套循环

for(int j=0;j<4;j++){
    ....
}
我想这就是问题所在。如果删除该选项,您将发现行分别旋转了0、1、2和3次


除此之外,还有一个bug,它通过数组上的越界访问来识别。您也必须修复它。

好的,我明白了,先生,这是我第一次使用uint8\t数据类型。我试图将每一行向左旋转一些值,即第一行0个位置,第二行1个位置,依此类推。我想我把逻辑搞乱了。g_aes_sbox[]是一个包含256个值的1D单元数组;nokay,我明白了,先生,这是我第一次使用uint8_t数据类型。我试图将每一行向左旋转一些值,即第一行0个位置,第二行1个位置,依此类推。我想我把逻辑搞乱了。g_aes_sbox[]是一个包含256个值的1D单元数组;非常感谢你,我现在明白了。非常感谢你,我现在明白了。