(ОП говорит мне, что узлы должны иметь массивы строк, поэтому указатель на указатель действительно корректен).
В любом случае, похоже, ваша проблема в том, что каждый узелимеет указатель на тот же буфер.Вы просто продолжаете копировать разные строки в один и тот же буфер, а затем назначаете адрес указателя на этот буфер каждому новому узлу.
Сначала я бы избавился от этих typedef.Я не знаю, сколько ясности они действительно добавляют.
Далее необходимо выделить новое хранилище для каждой строки.Функция стандартной библиотеки strdup () - это удобный способ сделать это:
// Turns out it's a fixed-size array, so we can blow off some memory
// management complexity.
#define CMDARRAYSIZE 21
struct node {
Node next;
char * transData[ CMDARRAYSIZE ];
};
// Node initialization:
int i = 0;
struct node * nod = (struct node *)malloc( sizeof( struct node ) );
// Initialize alloc'd memory to all zeroes. This sets the next pointer
// to NULL, and all the char *'s as well.
memset( nod, 0, sizeof( struct node ) );
for ( i = 0; i < CMDARRAYSIZE; ++i ) {
if ( NULL != data[ i ] ) {
nod->transData[ i ] = strdup( data[ i ] );
}
}
... но затем убедитесь, что когда вы освобождаете каждый узел, вы вызываете free (nod-> transData [n])для каждого ненулевого строкового указателя в nod-> transData.С не является трудосберегающим языком.