Массивы какого размера требуют malloc (или глобального присваивания)? - PullRequest
1 голос
/ 23 сентября 2011

Делая мои первые шаги с C, я быстро заметил, что массив int [ big number ] вызывает сбой моих программ при вызове внутри функции. Не так быстро, я обнаружил, что могу предотвратить это, определив массив с глобальной областью действия (вне функций) или используя malloc.

Мой вопрос:

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

Я имею в виду, безопасно ли использовать только, например, int i; для счетчиков и int chars[256]; для небольших массивов, или я должен просто использовать malloc для всех локальных переменных?

Ответы [ 3 ]

4 голосов
/ 23 сентября 2011

Вы должны понимать, в чем разница между int chars[256] в функции и использованием malloc().

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

Другое ключевое отличие состоит в том, что переменная, расположенная в стеке, технически исчезнет после того, как вы вернетесь из метода. (О, ваша программа может функционировать так, как будто она не исчезнет, ​​если вы продолжите обращаться к этому массиву, но хо-хо-хо опасно. .

2 голосов
/ 23 сентября 2011

Вы должны использовать malloc для динамического распределения памяти. Для массивов статического размера (или любого другого объекта) внутри функций, если требуемая память слишком велика, вы быстро получите ошибку сегментации. Я не думаю, что можно определить «безопасный предел», возможно, он зависит от конкретной реализации и других факторов, таких как текущий стек и объекты внутри него, созданные вызывающими для текущей функции. Я был бы соблазн сказать, что все, что меньше размера страницы (обычно 4 КБ), должно быть безопасным, если нет рекурсии, но я не думаю, что есть такие гарантии.

0 голосов
/ 23 сентября 2011

Это зависит.Если у вас есть гарантии того, что строка никогда не будет длиннее 100 ... 1000 символов, вы можете использовать буфер фиксированного размера.Если нет, то нет.Существует различие между чтением в аккуратном файле конфигурации x KB и XML-файле axe GB (без CR / LF).Это зависит.

Следующий выбор: хотите ли вы, чтобы ваша программа умерла изящно ?Это только выбор дизайна.

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