Как правильно инициализировать этот двойной указатель

#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);