传递指向类型定义数组的指针

时间:2018-09-20 10:38:58

标签: 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;
}

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

2 个答案:

答案 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,请将其包装在结构定义中。