Если вы не return newlist;
, вам нужно будет передать адрес list
, например, item pophead(node **list)
, чтобы вы могли использовать исходный указатель вместо копии. Почему? C - передача по значению, когда вы передаете переменную в качестве параметра, функция получает копию переменной. Любые изменения, которые вы делаете в своей функции, теряются при возврате.
Чтобы избежать этого, вы можете передать адрес параметра, и хотя функция все еще будет получать копию указателя, она будет содержать в качестве значения исходный адрес. Вы можете сделать:
item pophead(node **list)
{
head = *list;
// node *newlist = malloc(sizeof *newlist); // (no allocation needed)
node *newlist = NULL;
item result;
if(!*list)
{
perror("There is nothing to be pop\n");
return;
}
else
{
newlist = head->next;
result = head->data;
free(head);
*list = newlist;
}
return result;
}
( примечание: нет необходимости выделять для newlist
, вы просто назначаете адрес из существующего узла указателю, не копируя содержимое в новое хранилище)
Тогда в вызывающей функции вместо вызова:
item someitem = pophead (list);
вы бы позвонили
item someitem = pophead (&list);
( note: In C, нет необходимости разыгрывать возврат malloc
, это не нужно. См .: Я разыгрываю результат mallo c? )
Ничего не возвращается или struct item
В зависимости от того, пуст ли список
Из нашего расширенного обсуждения, исходя из того, что я почерпнул из нашего разговора, вы говорите с item result;
, если список пуст, вы бы хотели бы ничего не возвращать или иначе вы хотели бы вернуть result
.
Вы объявили, что ваша функция возвращает тип item
, и вы подтвердили, что item
- это тип struct
, а не typedef
из указателя . Тип определяет, что вы можете вернуть. Когда вы объявляете, что ваша функция возвращает тип item
- это то, что она должна возвращать. Если бы тип был item *
, то у вас была бы возможность вернуть NULL
(и пустой указатель) или указатель на выделенный блок, содержащий тип item
.
Вы можете вернуть struct item
инициализирует все нули в случае, если список пуст или структура полностью заполнена значениями, если в списке есть узлы. Где вы в настоящее время объявляете:
item result; /* which leaves the values indeterminate */
Вы можете инициализировать с помощью универсального инициализатора {0}
, или предпочтительной инициализацией в C будет использование именованного инициализатора , где вы можете установить значение первого члена в ноль (или пустую строку в случае массива символов) и все остальные члены будут инициализироваться нулем по умолчанию, например,
item result = {0};
Возвращая item
инициализированный ноль или возврат item
с членами, заполненными значениями, - это только два варианта вашей функции с типом возврата item
. Вы не можете просто return;
, как если бы вы делали тип возвращаемого значения void
, поэтому вы либо меняете тип функции, либо возвращаете result
, либо инициализируете все ноль или значениями.