在堆栈上初始化一个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;
}
OUTPUT: 0 4 8 12 48 255 0 0 48 55 23 108 0 0 56 255
答案 0 :(得分: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");
}
}
答案 1 :(得分:2)
在语句printf("%d ", *arr[i][j]);
中,运算符[]
的优先级高于*
。这意味着操作顺序错误。
改为使用(*arr)[i][j]
。
作为一般规则,将指针或数组隐藏在typedef后面是一种不好的做法,因为不清楚类型是什么。如果要使用typedef,请将其包装在结构定义中。