проблема в распределении памяти для массива strcture? - PullRequest
0 голосов
/ 13 мая 2011
int unsigned long size=(atoi(argv[2]))+1;

printf("\nthe size is %lu",size);
printf("\n am here 1");

if( (what_if_var=malloc((size)*sizeof(what_if)))== NULL)
{
    exit( -1 );
}

if((temp_var =malloc((size)*sizeof(what_if)))== NULL)
{
    exit( -1 );
}

когда я даю argv[2] как 367000, распределение памяти работает нормально, но когда я дал argv[2] как более чем 380000, программа получила выход?Есть ли другой способ добиться этого?

Ответы [ 4 ]

1 голос
/ 13 мая 2011

[отредактировано] есть ли способ выделить большое количество байтов?

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

1 голос
/ 13 мая 2011

Эти детали зависят от реализации malloc, я не думаю, что вы можете изменить их.Возможно, может помочь увеличение размера вашей кучи.

0 голосов
/ 13 мая 2011

Возможно, вы достигли предела использования памяти для вашего процесса.

ОС ограничивает объем памяти, который можно выделить в одном приложении.

Существует много способовЭта проблема возникает, но она зависит от ваших потребностей:

  1. Разделите работу на части: каждый раз выделяйте немного памяти, работайте с ней, а затем повторно (или перераспределяйте) память для следующей части
  2. Разделив работу с несколькими процессами, эти процессы могут обмениваться информацией для совместного использования работы
  3. Реализация собственного механизма подкачки: создайте один или несколько файлов для хранения вашей памяти и используйте их в качестве своей памяти
  4. Подробнее ...

Обратите внимание на издержки каждого решения

0 голосов
/ 13 мая 2011

Как предположил г-н Шикаданс, perror () должно помочь отследить, почему malloc () не работает. Этот код демонстрирует использование:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N_ARRAYS        2

int main (int argc, char **argv)
{
    char * my_arrays[N_ARRAYS];
    size_t  nbytes = 1024;
    int i;

    if (argc>1) {
        nbytes = atoi(argv[1]);
        if (nbytes == 0) {
            fprintf(stderr, "Parse error for input \"%s\"\n", argv[1]);
            exit(EXIT_FAILURE);
        }
    }

    for (i=0; i<N_ARRAYS; i++) {
        my_arrays[i] = malloc(nbytes);
        if (!my_arrays[i]) {
            perror("malloc");
            exit(EXIT_FAILURE);
        } else {
            printf("[%i] Successfully allocated %i bytes on the heap\n", i, nbytes);
        }
    }

    return 0;
}

Вы можете передать количество байтов для выделения как argv [1].

На моем компьютере с Linux я могу выделить до 2 ГБ для процесса, что является размером виртуального адресного пространства по умолчанию на моей машине. Если я попытаюсь превысить этот предел, malloc () завершится неудачно, и perror () скажет мне, почему:

# Allocate two 1024MB arrays
tom@gibbon:~/src/junk/stackoverflow$ ./a.out $((1024*1024*1024))
[0] Successfully allocated 1073741824 bytes on the heap
[1] Successfully allocated 1073741824 bytes on the heap
# Allocate two 1500MB arrays
tom@gibbon:~/src/junk/stackoverflow$ ./a.out $((1500*1024*1024))
[0] Successfully allocated 1572864000 bytes on the heap
malloc: Cannot allocate memory
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...