Если значения в my_map
не уникальны:
inv_map = {}
for k, v in my_map.iteritems():
inv_map[v] = inv_map.get(v, [])
inv_map[v].append(k)
У вас есть два варианта: во-первых, передать символ * некоторой функции и использовать его вместо выделения в какой-либо функции, или два, освободить возвращаемое значение позже.
Первый вариант:
char *somefunction(char *str, int somearg){
//some code
return str;
}
// Elsewhere...
char *str = (char *) malloc....;
somefunction(str, 123);
// Code...
free(str);
Второй вариант:
char *somestr = somefunction(123);
// Do something...
free(somestr);
Я лично предлагаю первый вариант, так как немного легче избежать утечки памяти, когда она не выделяется в рамках произвольных функций.
Вы освобождаете его, когда закончите с ним. Не существует правила, согласно которому free (), который соответствует malloc (), должен находиться в той же функции.
Вы должны освободить все выделенное пространство, но если вы вернете его, потому что вы будете использовать эту память место в других частях программы, поэтому после его использования вы должны освободить. Просмотрите каждое место в коде, которое вызывает функцию, и освободите место после использования возвращенного значения.
Если вы намереваетесь вернуть адрес блока, вам не следует free () блок, а вместо этого полагаться на вызывающий код, чтобы освободить () его позже. Это называется последовательной передачей.
Если вы освободите его в функции и вернете указатель, вызывающий код столкнется с неопределенным поведением, пытаясь получить доступ к уже освобожденному блоку.
Это практика для некоторых существующих функций (например, strdup ()
), но обычно это плохая идея. Требовать, чтобы пользователь знал, что происходит внутри вызова функции, является плохим требованием - подумайте, сколько функций вы используете, внутреннее устройство которых скрыто от вас.
Вообще говоря, вам нужно, чтобы пользователь передавал буфер и размер вместо того, чтобы выделять для них память.