2008-10-14 2 views
2

Это интервью с собеседованием, с которым я столкнулся. Они спросили, можем ли мы переделать Array, я сказал «да». Затем они спросили - зачем нам нужны указатели, так как большинство людей объясняют, что они теряют пространство памяти. Я не мог дать удовлетворительного ответа. Если какой-либо орган может дать удовлетворительный ответ, я буду обязан. Пожалуйста, укажите любую ситуацию, в которой вышеуказанное заявление может противоречить.может realloc Array, то зачем использовать указатели?

спасибо.

ответ

8

Вы можете перераспределить массив, который был распределен динамически. Если оно было назначено статически, оно не может быть перераспределено [безопасно]. *

Указатели хранят адреса данных в памяти. Они могут быть выделены, освобождаться и перераспределяться динамически с помощью новой/удалить операторы в C++ и таНос/бесплатно в C.

Я настоятельно рекомендую вам прочитать The C Programming Language по Керниган и Ритчи и твердый C текст ++ как C++ From the Ground Up Гербертом Schildt.

Использование динамической памяти, указателей, смещений и т. Д. Является основополагающим для использования этих двух языков. Не зная, как они работают, и почему они существуют, будет вероятной причиной того, что потенциальные работодатели отклонят вас.

* компилятор не должен позволить вам перераспределить ничего, что было выделено статически, но если это произойдет, то поведение не определено

+1

Является ли Шильдт C++ лучше, чем его «Аннотированный стандарт C»? – 2008-10-14 17:35:10

2

OK. Вы не можете перераспределить массив, который был объявлен статически. Цель использования указателей (вместо статически объявленного массива) заключалась бы в том, чтобы вы могли перераспределить пространство. Я думаю, чтобы быть технически корректным, вы могли бы перераспределить статически определенный массив, передав ему указатель, но я бы этого не хотел. Поведение не определено, если указатель относится к памяти, которая не была назначена malloc.

+0

Функция realloc позволяет нам увеличивать или уменьшать размер ранее выделенной области. (Наиболее часто используемым является увеличение области.) Например, если мы выделим место для 512 элементов в массиве, которые мы заполняем во время выполнения но обнаружите, что нам нужно место для более чем 512 элементов, мы можем вызвать realloc. – iankits 2008-10-14 17:00:04

+1

http://linux.die.net/man/3/realloc - все равно не поможет со статически выделенными элементами – warren 2008-10-14 17:05:18

1

Я не понимаю, как с помощью указателей «отходы памяти». Функция realloc: -

void *realloc(void *ptr, size_t size); 

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

5

Фраза немного странная, но для меня кажется, что вопрос с интервью был открытым вопросом, который поможет вам объяснить, что вы знаете о массивах, указателях, распределении динамической памяти и т. Д. Если бы я был интервьюером Я хочу, чтобы кандидат сформулировал различия между int *a = malloc(10 * sizeof(int)); и int a[10];. Следующий вопрос не сформулирован очень хорошо, но это, вероятно, попытка подтолкнуть кандидата в направлении разницы между указателем и массивом и отбросить ход мысли.

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