#c #pointers
Вопрос:
Я прохожу курс по C, и у меня возникли большие проблемы с инициализацией двойного указателя. Я приложил все усилия, чтобы свести практическое упражнение к этому коду, в котором ошибка может быть воспроизведена:
#include lt;stdio.hgt; #include lt;stdlib.hgt; #include lt;string.hgt; typedef struct _tCoordinateNode { struct _tCoordinateNode *next; } tCoordinateNode; typedef struct _tDateTimeNode { int a; tCoordinateNode *coordinatesList; struct _tDateTimeNode *next; } tDateTimeNode; typedef struct _ApiData { tDateTimeNode *timeNodeList; } tApiData; void dateTimeNode_insert(tDateTimeNode **_list) { if ((*_list) == NULL) { (*_list) = (tDateTimeNode *)malloc(sizeof(tDateTimeNode)); (*_list)-gt;a = 1; (*_list)-gt;coordinatesList = NULL; (*_list)-gt;next = NULL; } } tDateTimeNode *api_getTemporalData(tApiData *data) { return data-gt;timeNodeList; } int main() { tApiData data; data.timeNodeList = NULL; dateTimeNode_insert(amp;(api_getTemporalData(amp;data))); printf("%d", data.timeNodeList-gt;a); }
Я получаю ошибку ошибки сегментации, но я не могу понять, почему. Есть идеи, в чем причина ошибки? Я полагаю, что это должно сработать, и переменная должна быть установлена в 1.
Комментарии:
1. Вы уверены, что запустили именно этот код, чтобы получить ошибку seg? Не похоже, что это вызовет это. С этим кодом есть и другие проблемы, но, пожалуйста, сначала подтвердите, можно ли воспроизвести ошибку seg с помощью этого точного кода.
2. Эм, да, я запустил этот код с помощью команды gcc-o t test.c amp;amp; ./t, и я получаю ошибку ошибки сегментации в Ubuntu 20.04.
3.
a
Участником является анint
. Вы не печатаетеint
значения с помощьюprintf(timeNode-gt;a)
. Первым аргументом дляprintf
должна быть строка формата, указывающая, что выводить, включая преобразования из других аргументов в десятичные (например,%d
изint
), шестнадцатеричные и так далее.4. В дополнение к
printf
проблеме вам нужно знать, чтоtimeNode
это копияdata.timeNodeList;
значения. ИзменениеtimeNode
не меняетсяdata.timeNodeList;
. Просто выполните базовую отладку — распечатайте два значения указателя или изучите их в отладчике.5. Зачем
timeNode
вообще это делать? Просто пройдите внутрьamp;(date.timeNodeList)
. Если вы действительно должны, то это должно бытьtDateTimeNode **timeNode = amp;(data.timeNodeList); dateTimeNode_insert(timeNode);