Как уменьшение размера страницы влияет на программу C? [Дубликат]

Go действительно не имеет типа символа как такового. байт часто используется для символов ASCII, а руна используется для символов Unicode, но они оба являются просто псевдонимами для целых типов (uint8 и int32). Поэтому, если вы хотите заставить их печатать как символы вместо цифр, вам нужно использовать Printf("%c", x). Спецификация формата %c работает для любого целочисленного типа.

30
задан Patrick McDonald 21 February 2009 в 21:25
поделиться

9 ответов

Ваш массив слишком велик, чтобы вписаться в стек, подумайте об использовании кучи:

int *sieve = malloc(2000000 * sizeof(*sieve));

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

Совет : - Не забудьте освободить динамически выделенную память, если она больше не нужна.

48
ответ дан Patrick McDonald 18 August 2018 в 03:45
поделиться
  • 1
    Поскольку это C, вам не нужно (и на самом деле не должно) отличать возвращаемое значение malloc. – aib 23 February 2009 в 03:19
  • 2
    Почему бы вам не отдать результат malloc? Разве вам не пришлось бы бросать его из пустоты *, чтобы сделать что-нибудь с ним? – Amy 27 February 2009 в 17:19
  • 3
    @ yodaj007: Вам не нужно явно указывать его. Поскольку назначенная переменная также относится к типу указателя, присваивание выполняет неявное преобразование. – jweyrich 10 February 2011 в 18:45
  • 4
    @Amy Прочтите это: «Я передаю результат malloc. В нем объясняются несколько причин, по которым not использовать malloc (или любую другую функцию выделения памяти) в C. – WhozCraig 26 August 2015 в 17:11

Поскольку Turbo C / C ++ - это 16-битный тип данных компилятора, потребляет около 2 байтов. 2 байта * 2000000 = 40 000 000 байтов = 3.8147 МБ пространства.

Автоматические переменные функции хранятся в стеке, и это вызвало переполнение памяти стека. Вместо этого используйте память данных [с использованием статической или глобальной переменной] или динамическую память кучи [с помощью malloc / calloc] для создания необходимой памяти в соответствии с доступностью отображения памяти процессора.

0
ответ дан Arun Chettoor 18 August 2018 в 03:45
поделиться

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

int main(int argc, char* argv[])
{
    int * sieve;
    sieve = malloc(20000);
    return 0;
}
2
ответ дан Cogsy 18 August 2018 в 03:45
поделиться
  • 1
    вы забыли освободить (просеять) – Nathan Fellman 22 February 2009 в 08:26
  • 2
    И проверьте сито для NULL – paulm 12 May 2014 в 13:26
  • 3
    «Я только решу для тебя» - Зохан – DragonLord 30 July 2015 в 19:19
  • 4
    Я думаю, вы имели в виду sieve = malloc(20000 * sizeof *sieve) - если ваша платформа не имеет int размера 1 (и даже тогда я бы не вставлял это предположение в код). – Toby Speight 16 May 2018 в 16:05

Ваш массив огромен.

Возможно, ваш компьютер или ОС не имеют или не хотят выделять столько памяти.


Если вам абсолютно необходим огромный массив, вы можете попытаться выделить его динамически (используя malloc(...)), но тогда вы рискуете утечки памяти. Не забывайте освобождать память.

Преимущество malloc заключается в том, что он пытается выделить память в куче вместо стека (поэтому вы не получите переполнение стека).

Вы можете проверить значение, возвращаемое malloc, чтобы увидеть, было ли выделение успешным или неудачным. Если это не удается, просто попробуйте malloc меньшего массива.


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

Еще одним вариантом было бы хранить вещи в файле, потоковые данные «на лету». Этот подход является самым медленным.

Если вы идете на хранение на жесткий диск, вы можете также использовать существующую библиотеку (для баз данных)

0
ответ дан Ivan Rubinson 18 August 2018 в 03:45
поделиться

Вместо этого используйте malloc. Синтаксис:

newnode=(struct node *)malloc(sizeof(struct node))
-2
ответ дан Math 18 August 2018 в 03:45
поделиться

Есть 3 способа:

  1. Выделить массив в куче - использовать malloc(), как предполагали другие плакаты. Не забудьте free() его (хотя для main() это не так важно - ОС будет очищать память для вас при завершении программы).
  2. Объявить массив на уровне единицы - он будет выделен в сегменте данных и видимом для всех (добавление static к объявлению ограничит видимость для единицы).
  3. Объявите свой массив как static - в этом случае он будет выделен в сегменте данных, но будет видимым только в main().
12
ответ дан qrdl 18 August 2018 в 03:45
поделиться
  • 1
    Я бы просто сделал его статическим: main() следует вызывать только один раз, поэтому нет никаких подводных камней; нет необходимости в malloc() здесь ... – Christoph 21 February 2009 в 11:58

Это около 7 МБ пространства стека. В визуальной студии вы должны использовать / STACK: ###, ###, чтобы отобразить нужный размер. Если вы действительно хотите получить огромный стек (это может быть хорошей причиной, используя LISP или что-то еще :), даже куча ограничена небольшими ассигнованиями, прежде чем заставить вас использовать VirtualAlloc), вы также можете настроить PE для создания с помощью / LARGEADDRESSAAWARE (компоновщик Visual Studio снова), но этот заголовок PE вашего конфигуратора позволяет вашему скомпилированному двоичному файлу обращаться к полному 4 ГБ 32-битного адресного пространства (если выполняется в WOW64). Если вы построите действительно массивные двоичные файлы, вам также, как правило, нужно будет сконфигурировать / bigobj в качестве дополнительного параметра-линкера.

И если вам все еще нужно больше места, вы можете радикально нарушить соглашение, используя что-то simular to (снова ссылка MSVC ) / merge :, который позволит вам упаковать один раздел в другой, так что вы можете использовать каждый отдельный байт для отдельного разделяемого раздела / данных. Естественно, вам также нужно будет настроить разрешения SECTIONS в файле def или с помощью #pgrama.

1
ответ дан RandomNickName42 18 August 2018 в 03:45
поделиться

Есть ли какая-то причина, по которой вы не можете использовать alloca () для выделения необходимого пространства в фрейме стека в зависимости от того, насколько большой объект действительно должен быть?

Если вы это сделаете и все равно выложите стек, положите его в выделенную кучу. Я настоятельно рекомендую НЕ объявлять его как static в main () и помещать его в сегмент данных.

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

Что (точно) вы пытаетесь выполнить?

0
ответ дан Tim Post 18 August 2018 в 03:45
поделиться
  • 1
    Я использую проблемы с ProjectEuler.net, чтобы изучить C, и реализую алгоритм Sieve of Eratosthenes, поэтому он должен быть таким большим. malloc отлично работает для моих целей, хотя – Patrick McDonald 21 February 2009 в 21:10

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

1
ответ дан user 18 August 2018 в 03:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: