gpt4 book ai didi

c - 传递指向 typedef 数组的指针

转载 作者:太空宇宙 更新时间:2023-11-04 00:20:03 24 4
gpt4 key购买 nike

在堆栈上初始化 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;
}

输出: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");
}
}

关于c - 传递指向 typedef 数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52423207/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com