Можно перераспределить массив, тогда зачем использовать указатели?

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

Спасибо.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
3 254
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

Функция realloc позволяет нам увеличивать или уменьшать размер ранее выделенной области (чаще всего используется для увеличения области). Например, если мы выделяем место для 512 элементов в массиве, который мы заполняем во время выполнения, но обнаруживаем, что нам нужно место для более чем 512 элементов, мы можем вызвать realloc.

iankits 14.10.2008 21:00
linux.die.net/man/3/realloc - still won't help with statically-allocated items
warren 14.10.2008 21:05
Ответ принят как подходящий

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

Указатели содержат адреса данных в памяти. Их можно выделять, освобождать и перераспределять динамически с помощью операторов new / delete в C++ и malloc / free в C.

Я настоятельно рекомендую вам прочитать Язык программирования C Кернигана и Ричи и твердый текст на C++, например C++ с нуля Герберта Шильдта.

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

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

C++ Шильдта лучше его «Аннотированного стандарта C»?

Jonathan Leffler 14.10.2008 21:35

Я не видел его Annotated C Standard - поэтому я не могу комментировать напрямую, но я использовал книгу Ground Up в классах и обнаружил, что студенты действительно `` понимают '', используя этот текст

warren 15.10.2008 17:44

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

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

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

«тратит впустую память» может означать, что int * ra = malloc (10 * sizeof (int)); приводит к использованию большего объема памяти, чем int ra [10]; из-за накладных расходов на реализацию malloc. Но есть более веские причины использовать массивы в стеке там, где это возможно.

Steve Jessop 21.10.2008 15:51

О, и когда массив принадлежит чему-то, представленному структурой, существует очевидная «трата памяти», заключающаяся в том, что для хранения указателя на массив вместо того, чтобы просто встраивать массив в структуру и получать доступ по имени члена, используется дополнительный sizeof (void *) байты.

Steve Jessop 21.10.2008 15:55

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

Другие вопросы по теме