Массивы в структурах в C

Можно использовать хеш, который содержит только одно значение для каждого ключа:

Hash[*recs.map{|ar| [ar[attr],ar]}.flatten].values
5
задан Suma 16 September 2009 в 12:40
поделиться

4 ответа

Идея заключается в том, что хотя FlashRegion выглядит как структура фиксированного размера, на самом деле он имеет динамический размер. Магия происходит при выделении структуры - вместо вызова (FlashRegion *) malloc (sizeof (FlashInfoEx)) или new FlashRegion вы вызываете что-то вроде (FlashRegion *) malloc (sizeof (FlashInfoEx) + sizeof (FlashRegion) * (numRegions-1))

6
ответ дан 14 December 2019 в 01:12
поделиться

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

pFlashInfoEx = malloc(offsetof(PFlashInfoEx, region) + g_pStorageDesc->dwNumRegions *  sizeof(FlashRegion));

, это плохо взаимодействует с попыткой использовать 'new' в C ++; вам нужно выделить память вручную:

void *mem = ::operator new(offsetof(PFlashInfoEx, region) + g_pStorageDesc->dwNumRegions *  sizeof(FlashRegion));
pFlashInfoEx = new(mem) PFlashInfoEx;
for (int i = 1; i < g_pStorageDesc->dwNumRegions; i++)
    new (&pFlashInfoEx->region[i]) FlashRegion;
2
ответ дан 14 December 2019 в 01:12
поделиться

Используемый вами интерфейс использует структуру struct hack . Это означает, что вам необходимо вручную динамически выделить достаточно памяти для структуры, как если бы она была объявлена ​​с областью, являющейся массивом более 1 FlashRegion .

Для этого интерфейса должно быть достаточно места для как минимум и массив dwNumRegions FlashRegion s.

Что-то вроде offsetof (FlashInfoEx,

1
ответ дан 14 December 2019 в 01:12
поделиться

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

0
ответ дан 14 December 2019 в 01:12
поделиться
Другие вопросы по тегам:

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