Это объявление
typedef struct {
struct chain *next;
int contents; } chain;
неверно. Там объявлены две структуры. Первая - безымянная структура
typedef struct {
, для которой было назначено имя типа определения chain
. И в этой безымянной структуре объявлена еще одна структура struct chain
, которая используется в качестве спецификатора элемента данных next
.
struct chain *next;
Таким образом, указатели типов chain *
и struct chain *
не совместимы.
Структура должна быть объявлена как
typedef struct chain {
struct chain *next;
int contents;
} chain;
В этом фрагменте кода
list = malloc(sizeof(chain));
p = list;
for(index=0;index<10;index++) {
(*p).contents = index;
(*p).next = malloc(sizeof(chain));
p = (*p).next;
} ;
Вы выделили 11 объектов цепочки типов. Однако в этом фрагменте кода
while (index < 9) {
printf("cell # %d: %d\n",index,(*p).contents);
p = (*p).next;
free(pointer);
pointer = p;
index++;
} ;
вы освободили только 9 динамически размещенных объектов цепочки типов.
Кроме того, значение списка указателей не изменилось. Таким образом, программа вызывает неопределенное поведение в этом выражении
printf("First cell: %d\n",(*list).contents);
Программа может быть написана, например, следующим образом.
#include <stdlib.h>
#include <stdio.h>
typedef struct chain
{
struct chain *next;
int contents;
} chain;
int main( void )
{
const int N = 10;
chain *list = NULL;
chain **current = &list;
for ( int i = 0; i < N; i++ )
{
*current = malloc( sizeof( chain ) );
( *current )->contents = i;
( *current )->next = NULL;
current = &( *current )->next;
} ;
for ( int i = 0; i < N - 1; i++ )
{
printf( "cell # %d: %d\n", i, list->contents );
chain *tmp = list;
list = list->next;
free( tmp );
}
printf( "First cell: %d\n", list->contents );
while ( list != NULL )
{
chain *tmp = list;
list = list->next;
free( tmp );
}
return 0;
}
Вывод программы:
cell # 0: 0
cell # 1: 1
cell # 2: 2
cell # 3: 3
cell # 4: 4
cell # 5: 5
cell # 6: 6
cell # 7: 7
cell # 8: 8
First cell: 9