Выделить память для массива указателей на символы? (C) [дублировать]

В моем случае у нас есть временные ряды с разных устройств, но некоторые устройства не могли отправить какое-либо значение в течение некоторого периода времени. Таким образом, мы должны создавать значения NA для каждого устройства и период времени, а затем делать fillna.

df = pd.DataFrame([["device1", 1, 'first val of device1'], ["device2", 2, 'first val of device2'], ["device3", 3, 'first val of device3']])
df.pivot(index=1, columns=0, values=2).fillna(method='ffill').unstack().reset_index(name='value')

Результат:

        0   1   value
0   device1     1   first val of device1
1   device1     2   first val of device1
2   device1     3   first val of device1
3   device2     1   None
4   device2     2   first val of device2
5   device2     3   first val of device2
6   device3     1   None
7   device3     2   None
8   device3     3   first val of device3
5
задан systemsfault 20 October 2009 в 11:48
поделиться

5 ответов

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

Кроме того, ваш код использует strlen() для получения размера строки - убедитесь, что вы помните, что возвращенный размер не будет содержать завершающий нулевой символ ('\0'); размер памяти в строковой константе равен strlen(string) + 1.

13
ответ дан Carl Norum 21 August 2018 в 09:51
поделиться
  • 1
    Это был быстрый и грязный тестовый код: D. Так что это просто опечатка. – systemsfault 15 October 2009 в 08:28
  • 2
    Вы должны иметь возможность редактировать свой пост и очищать его; Я соответствующим образом изменю свой ответ, если / когда это произойдет. – Carl Norum 15 October 2009 в 08:29
  • 3
    Не обязательно, чтобы он выделил память. Есть некоторые функции, возвращающие выделенную память и другие подсистемы, освобождающие / изменяющие ее. Пример CreateDIBSection. – Predrag Manojlovic 13 January 2015 в 23:05
  • 4
    @PredragManojlovic - что CreateDIBSection и что он должен делать с этим вопросом? – Carl Norum 13 January 2015 в 23:06
  • 5
    @CarlNorum Это системная функция, которая выделяет вам буфер (на данный момент вы знаете размер). Он относится к подсистеме, которая в конечном итоге изменяет размер буфера или освобождает его. Таким образом, это случай, когда вы не можете знать размер буфера, и вам может потребоваться определить размер или проверить буферный указатель. Это всего лишь ответ на: «Вы создали массивы, поэтому вы знали их размеры». :) – Predrag Manojlovic 13 January 2015 в 23:14

Указатель указывает только на то, где начинаются данные. Он ничего не знает о размере данных.

2
ответ дан André van Schoubroeck 21 August 2018 в 09:51
поделиться

sizeof знает только полный размер массива, если это статически известно во время компиляции. Для указателя он вернет размер адреса памяти, т. Е. 4 на 32-битном, 8 на 64-битном.

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

5
ответ дан sbi 21 August 2018 в 09:51
поделиться
  • 1
    Я считаю, что вы неверно истолковали мое заявление, или я не изложил это четко. sizeof (* p) может быть 1, но sizeof (p) совпадает с sizeof (void *) – asveikau 15 October 2009 в 08:37
  • 2
    @asveikau: Теперь я вижу, что я неправильно истолковал вас. Сожалею. – sbi 15 October 2009 в 09:01

Нет стандартного способа сделать это. Вы должны сохранить длину выделенной памяти в другой переменной или использовать «контейнер», который отслеживает вас.

На некоторых платформах есть функции для поиска количества байтов в распределении, например. Symbian как функция AllocSize(ptr).

3
ответ дан Will 21 August 2018 в 09:51
поделиться
5
ответ дан sbi 1 November 2018 в 04:10
поделиться
Другие вопросы по тегам:

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