динамическое выделение памяти под структуру
От: Dedaulus  
Дата: 14.09.07 21:11
Оценка: -1
Здравствуйте, уважаемые коллеги-программисты.

У меня возникла следующая проблема с выделением памяти под массив структур:
одна и та же программа, скомпилированная разными компиляторами на разных машинах, но с одинаковым количеством ОЗУ и виртуальной памяти, не может выделить всю доступную память. При чем один и тот же компилятор на разных машинах выдает разные результаты. Особенно интересно то, что количество экземпляров, под которые выделяется память, никак не зависит от ее свободного на данный момент размера. И тем более странно, когда программа выделяет около 100 мегабайт памяти и не более, когда доступно более 500. Проверялось на системах с 1 и 2 GB памяти. Компиляторы: VC2003, VC2005, Borland 5.9.1.0
Это все касается Windows XP SP2. В Linux (Debian 4.0, ядро 2.6.18, компилятор gcc 4.1.1) программа выделяет под себя всю доступную память (в том числе из свапа), после чего убивается системой.

Комментарий к исхднику: объявляется структура из char* для строки и char** для массива строк, после чего до бесконечности выделяется память для структуры, char*, char**, и каждого элемента char** (10).
Ну и собственно исходник:


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

#define SIZE 10

typedef struct sample
{
    char *name;
    char **list;
} sample;

int main ()
{
    sample *samples;
    unsigned int i = 0, j;

    samples = (sample *)malloc (0);

    while (1)
    {
        if (samples = (sample *)realloc (samples, (i + 1) * sizeof (sample)))
        {
            if ((samples + i)->name = (char *)calloc (300, 1))
                strcpy ((samples + i)->name, "blablabla");
            else
            {
                printf ("\nCouldn't allocate memory for samples->name\n");
                break;
            }
            
            (samples + i)->list = (char **)malloc (0);
            j = 0;
            while (j++ < SIZE)
                if ((samples + i)->list = 
                    (char **)realloc ((samples + i)->list, 
                    (j + 1) * sizeof (char *)))
                    if (*((samples + i)->list + j) = (char *)calloc (300, 1))
                        strcpy (*((samples + i)->list + j), "blablabla");
                    else
                    {
                        printf ("\nCouldn't allocate memory for samples->list item\n");
                        break;
                    }
                else
                {
                    printf ("\nCouldn't reallocate memory for samples->list\n");
                    break;
                }

            printf ("\r%d", i++);
        }
        else
        {
            printf ("\nCouldn't reallocate memory for samples *\n");
            break;
        }
    }

    system ("pause");

    return 0;
}



Ну и вопрос: что я делаю неправильно? Ведь должен быть способ выделять ВСЮ память.

С уважением.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.