Статистический массив в С++ ведет себя неадекватно

Рейтинг: 0Ответов: 1Опубликовано: 24.05.2023

Хотелось бы знать, как в С++ объявлять глобальные массивы в функции main? Код мой программы такой:

int factorize(long long x) {
    static long* prime;
    long index = 0, n = prime[index];
    while (n * n <= x) {
       // ...
};

int main() {
    long* prime = (long*) malloc(51100000);
    // ....  
};

Когда программа доходит до строки "n = prime[index]", получается segmentation fault.

Ответы

▲ 3

static long* prime; в функции factorize и long*prime в main — две очень большие разницы...

Для языка С:

int factorize(long long x) {
    static long* prime = NULL;
    if (prime == NULL) prime = malloc(51100000);
    long index = 0, n = prime[index];
    while (n * n <= x) {
       // ...
};

Как-то так (не знаю, точно ли вам нужна именно такая память...). malloc будет вызван один раз, при первом обращении к функции factorize (хотя, если вызов будет неуспешен, то будет вызываться при каждом вызове :)).

Да, о терминологии... Здесь "статическая" переменная-указатель prime, но не массив, память для которого выделяется динамически.

P.S. В С++ можно

    static long* prime = NULL;
    if (prime == NULL) prime = malloc(51100000);

заменить на

    static long* prime = (long*)malloc(51100000);