Предотвращение начальной ошибки размера неупорядоченного хранения памяти

(Примечание: вопрос был отредактирован с тех пор, как я его написал)

Из-за способа компиляции C он должен знать, куда переходить при вызове функции. Поскольку вы можете вызывать его из любого места, или даже где-то разрыв не имеет смысла, вы не можете иметь оператор break; в своей функции и заставить его работать так.

В других ответах предлагались ужасные решения, такие как установка глобальной переменной с использованием #define или longjumping (!) Из функции. Это очень плохие решения. Вместо этого вы должны использовать решение, которое вы ошибочно отклонили в своем первом абзаце, и вернуть значение из вашей функции, которое указывает состояние, в котором вы хотите вызвать break в этом случае, и сделать что-то вроде этого:

#include <stdbool.h>

bool checkAndDisplay(int n)
{
    printf("%d\n", n);
    return (n == 14);
}

int main(void) {
    for (int i = 0; i <= 100; i++) {
        if (checkAndDisplay(i))
            break;
    }
    return 0;
}

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

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

#include <stdbool.h>

void checkAndDisplay(int n, bool* wantBreak)
{
    printf("%d\n", n);
    if (n == 14)
        wantBreak = true;
}

int main(void) {
    bool wantBreak = false;
    for (int i = 0; i <= 100; i++) {
        checkAndDisplay(i, &wantBreak);
        if (wantBreak)
            break;
    }
    return 0;
}

Поскольку ваши параметры имеют фиксированный тип Я предлагаю вам использовать приведение для передачи указателя на один из параметров, например foo(a, b, (long)&out);

20
задан neversaint 26 May 2009 в 05:11
поделиться

3 ответа

Вы превысили максимальный размер кучи JVM. Это зависит как от JVM, так и от ОС. В большинстве 32-битных систем максимальное значение будет 2 ГБ, независимо от доступной физической памяти.

17
ответ дан 30 November 2019 в 00:27
поделиться

По умолчанию Java работает в 32-битном режиме. Обязательно укажите параметр -d64, чтобы перевести его в 64-битный режим. В 64-битном режиме у вас не должно возникнуть проблем с выделением JVM объемом 6 ГБ.

11
ответ дан 30 November 2019 в 00:27
поделиться

На самом деле максимальный размер памяти в 32-битных системах может варьироваться и составлять до 4 ГБ, но обычно 2 ГБ. Часто возможно повторно связать ядро, чтобы увеличить его до 3 или 3,5 ГБ. Проблема, конечно, в том, что у вас просто нет адресного пространства для отображения дополнительной памяти. Вы пробовали 64-битную машину?

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

4
ответ дан 30 November 2019 в 00:27
поделиться
Другие вопросы по тегам:

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