NewDNode
не имеет связанного с ним выделения памяти.Поэтому, когда вы делаете
newDNode = (struct dListNode *)malloc(sizeof(struct dListNode)+sizeof(struct data));
, это просто выделяет память для newDnode
, а не newDnode->val
.Поскольку newDNode->val
содержит только то, что осталось в памяти в этом месте (или, может быть, даже 0 (указатель NULL)), и вы пытаетесь присвоить значение в ячейке памяти, которая не находится ни в стеке, ни в куче, программажалуется, потому что вы пытаетесь получить доступ к неназначенной части памяти.
Вот что вы должны сделать:
newDNode = malloc(sizeof(struct dListNode));
newDnode->val = malloc(sizeof(struct data));
printf("newnode created\n");
newDNode->val->payload = rand() % 1000;
printf("newnode payload: %i\n", newDNode->val->payload);
И в качестве подсказки, всегда старайтесь не приводить результат, возвращенный malloc (илилюбая другая функция выделения памяти).Это считается плохой практикой.