Проблема в том, что указатель передается по значению, поэтому ваши изменения отменяются. Вам действительно нужен указатель на указатель, чтобы сделать это правильно. Как и вы бы:
void init(List** l) {
*l = (List*) malloc(sizeof(List));
// ...
}
И когда вы звоните, вы бы использовали init(&list)
вместо init(list)
. Конечно, в этом случае имеет смысл просто пойти дальше и вернуть результат вместо использования указателя на указатель:
List* init() {
List* result = (List *) malloc(sizeof(List));
result->length = 3;
return result;
}
И затем, с учетом вышесказанного, вы можете просто использовать list = init();
.
Обратите внимание, что в C ++ вы можете использовать ссылки вместо указателей, но смешивание ссылок и указателей невероятно запутанно. Здесь использование возвращаемого типа - действительно самое интересное.
Если вам абсолютно необходимо использовать существующую подпись, вы можете быть хитрым и инициализировать список, тогда в функции init()
вы можете сделать следующий переданный указатель списка указателем на список, который вы действительно хотите создать. Затем, после вызова init()
, вы можете взять следующий указатель и удалить исходный объект списка, который вы создали. Или вы могли бы просто иметь первый элемент с помощью какого-то фиктивного элемента.