Передача указателя на массив с определением типа - PullRequest
0 голосов
/ 20 сентября 2018

После инициализации массива беззнаковых символов 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 голосов
/ 20 сентября 2018

Скрывать массивы или указатели за 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");
    }
}
0 голосов
/ 20 сентября 2018

В операторе printf("%d ", *arr[i][j]); оператор [] имеет более высокий приоритет, чем *.Это означает, что операции выполняются в неправильном порядке.

Используйте взамен (*arr)[i][j].

Как правило, прятать указатели или массивы за typedef - плохая практика, потому что не очевидно, чтотип есть.Если вы хотите использовать typedef, поместите его в определение структуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...