передача двумерного массива в функцию - PullRequest
0 голосов
/ 04 января 2012

gcc 4.6.2 c89

У меня есть следующий 2D-массив, который я хочу передать функции:

char elements[MAX_NUM_ELEMENTS][MAX_STRING_LEN] = {{0}};

Мой прототип функции:

int get_elements(char **elements)

И я вызываю функцию следующим образом:

get_elements(elements);

Тем не менее, я получаю следующую ошибку:

expected ‘char **’ but argument is of type ‘char (*)[128]’

Все массивы переходят в указатели, поэтому уверен, почему я не могупросто передайте указатель.

Большое спасибо за любые советы,

Ответы [ 5 ]

2 голосов
/ 04 января 2012

"Все массивы распадаются на указатели" - распространенное заблуждение о C.

Первые несколько ответов в этом FAQ проясняют проблему.

1 голос
/ 04 января 2012

Если объект для передачи вашей функции определен как:

char elements[MAX_NUM_ELEMENTS][MAX_STRING_LEN];

Прототип вашей функции не должен быть:

int get_elements(char **elements)

, а скорее:

int get_elements(char elements[][MAX_STRING_LEN])

или

int get_elements(char (*elements)[MAX_STRING_LEN])

(обе формы эквивалентны)

Причиной этого является тип значения объекта типа

char [MAX_NUM_ELEMENTS][MAX_STRING_LEN]

- это

char (*)[MAX_STRING_LEN] (указатель на массив из MAX_STRING_LEN символов), а не char ** (указатель на указатель char).

1 голос
/ 04 января 2012

Ваш прототип выглядит очень испорченным, ему не хватает имени типа.

И вы не можете использовать указатель «сгнивший», так как это потеряло бы информацию о размерах массива, которые (очевидно,), необходимого для правильного вычисления доступа.

На мой взгляд, лучший способ - передать указатель на первый элемент вместе с размерами по мере необходимости.Для 2D это будет сделано:

int get_elements(int *elements, size_t width, size_t height);

Это также требует, чтобы вы решили и придерживались макета в памяти для ваших элементов, таких как основной столбец или основной ряд.Это влияет на то, как вы вычисляете адрес для данного элемента.

1 голос
/ 04 января 2012

«Двумерный массив и двойной указатель не совпадают» «Двумерный массив - это массив указателей»

Это то, что я узнал / запомнил, читая о массиве и указателе

Скажем, элементы - данные имеют память, начинающуюся в ячейке 100 .. И элементы Pointer имеют память в местоположении 50 ..

Элемент данных получает выделенную память от 100 до 100 + MAX_NUM_ELEMENTS * MAX_STRING_LEN -1 .. И вам нужно получить доступ к данным от 100 ..

Но вы передаете элемент в виде двойного указателя .. поэтому он пытается получить доступ к (50-> 100-> фактическим данным) Location вместо доступа к (50-> 100) местоположению ..

Если вы измените прототип на int get_elements (char * element []) .. Это будет работать ..

1 голос
/ 04 января 2012

Вы можете разыграть:

get_elements((char **) elements);

char ** и char[128][128], очевидно, разных типов.

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