初始化堆栈上的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
隐藏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)