将指针传递给typedef'ed数组

Ben*_*sen 1 c arrays pointers

初始化堆栈上的4x4无符号字符数组后,我想将指向该数组的指针传递给另一个函数.我不明白为什么会失败.

从我的角度来看,它应该与将指针传递给任何其他数组(数组的起始地址)相同.

虽然在尝试传递它时,似乎只有阵列中的第一个位置在正确的位置,并且我在所有其他位置访问随机存储器.

我在这做错了什么?任何解释为什么会这样?

#include <stdio.h>

typedef unsigned char multi_array[4][4];


void print_array(multi_array* arr){
    unsigned char i,j;

    for(i = 0; i < 4; i++){
        for(j = 0; j < 4; j++){
            printf("%d ", *arr[i][j]);
        }
    }
    printf("\n");
}

int main() {
    unsigned char i,j,z;
    multi_array arr;    // Aren't we allocating memory on the stack for a 4x4 u_char array?

    z = 0;

    for(i = 0; i < 4; i++){
        for(j = 0; j < 4; j++){
            arr[i][j] = z++;
        }
    }

    print_array(&arr); // Arent we passing the address of the beginning of the array here?
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

OUTPUT: 0 4 8 12 48 255 0 0 48 55 23 108 0 0 56 255

Lun*_*din 8

隐藏typedef后面的数组或指针是不好的做法.你刚刚发现了其中一个原因.

multi_array* arr在你的例子中相当于unsigned char(*arr)[4][4]一个数组指针.*arr[i][j]由于运算符优先级,您无法取消引用它.[]优先级高于*.你不得不这样做(*arr)[i][j].

正确的解决方案是根本不使用typedef,而是使用:

void print_array (size_t x, size_t y, unsigned char arr[x][y]) {
    for(size_t i = 0; i < x; i++){
        for(size_t j = 0; j < y; j++){
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
}
Run Code Online (Sandbox Code Playgroud)