С помощью mmap () как можно создавать структуры динамического размера - PullRequest
0 голосов
/ 02 марта 2012

Привет, у меня есть следующий сценарий

#define CONSTANT 10

struct structA{
    int var1;
    int var2[CONSTANT];
};

main(){
    structA *varA = NULL;
    int i;

    /* some C code */


    varA = mmap(0,..);
    for(i = 0; i < CONSTANT; i++){
        varA.var2[i] = /* C code */ ;
    }

    /* C code */

}

Здесь количество элементов в массиве var2, равном structA, является постоянным и, следовательно, на varA.var2[i] можно напрямую ссылаться. Но если число CONSTANT должно определяться динамически во время выполнения, как следует изменить определение структуры?

Ответы [ 3 ]

3 голосов
/ 02 марта 2012

Самый простой способ - использовать элемент гибкого массива C99:

struct structA{
    int var1;
    int var2[];
};

Тогда вы можете просто mmap(NULL, sizeof(int) * (num + 1), ...). Просто будьте осторожны с гибкими элементами массива, sizeof ведет себя забавно с ними (без учета их размера).

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

2 голосов
/ 02 марта 2012

Наиболее распространенный способ сделать это:

struct structA{
    int var1;
    int var2[1];
};

На самом деле это не массив с одним элементом, потому что вы выделяете больше памяти, чем размер structA.

1 голос
/ 02 марта 2012

Число CONSTANT не может быть определено динамически во время выполнения, так как оно влияет на размер структуры.

Обычный трюк для того, что вы пытаетесь сделать (я не уверен, строго ли это C, но это очень распространено) - создать

struct structA{
    int var1;
    int var2[0];
};

и при отображении или выделении выделяйте (sizeof(structA) + sizeof(int) * CONSTANT) байт.

...