2013-02-13 4 views
0

мой коллега задал этот вопрос: Array size in multidimensional array with pointersРасчет размера массива разыменовывая его указатель

Ответы все довольно окончательным в том, что вы не можете работать, размер массива, на который ссылается указатель.

Моя первоначальная мысль заключалась в том, чтобы сначала разыменовать указатель, а затем вычислить размер самого массива. Почему это не сработает? Разве разыменование указателя не дает вам полный массив?

+0

nope, только первый элемент в массиве, который сам по себе не имеет смысла в этом контексте ... Размер не является частью информации, которая * встроена * в базовом представлении ... – Nim

+0

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

+0

Вы можете найти это полезным http://stackoverflow.com/a/5655614/1458030 – qPCR4vir

ответ

3

is no «полный массив» в C, по крайней мере, не так, как вы, кажется, ожидаете, что это произойдет.

Массив всегда может быть представлен как указатель на первый элемент вместе с информацией о макете массива.

Эта информация недоступна во время выполнения, она является частью типа для реальных массивов (например, int foo[6][2][12]), поэтому компилятор может просто использовать эти знания непосредственно при создании кода для доступа к элементам. Как указывал Лундин, исключение составляют массивы переменной длины (введенные в C99). Для них компилятор должен добавить код во время выполнения, чтобы сделать работу sizeof.

Если вы передадите foo на функцию, принимающую int *, нет возможности магически воссоздать данные о размерности. Все ссылки на int похожее, вы можете пройти &foo[0][0][0] или просто адрес равнины int.

+0

Скобка: кроме специального случая VLA, где sizeof оценивается во время выполнения. – Lundin

0

К сожалению, в C нет способа определить размер массива. Массивы просто указывают на расположение памяти. Вы должны знать, сколько памяти в этом месте является частью массива.

Вот почему большинство методов из стандартной библиотеки, которые используют массивы, либо нуждаются в массивах с nul-terminated, либо дополнительный аргумент, указывающий их длину.

+3

Массивы - это не просто указатели на ячейки памяти. Они * распадаются * на такие указатели при прохождении. – StoryTeller

+1

Массивы не указатели и указатели не являются массивами. Когда вы распространяете дезинформацию, мы получаем такие вопросы, как текущий ... – Blastfurnace

Смежные вопросы