Используя names[i] = nameRow;
, вы снова и снова сохраняете один и тот же указатель (на один и тот же блок памяти), но с каждой прочитанной строкой вы перезаписываете содержимое , если этот единственный фрагмент памяти.
Вам необходимо скопировать содержимое, которое вы читаете, в ваш буфер nameRow
, прежде чем перезаписать его, а затем на следующей итерации цикла.
names[i] = strdup(nameRow);
Функция strdup
выполняет две функции: (1) она резервирует память, достаточно большую для хранения копии nameRow
(используя malloc
), и (2) затем копирует содержимое.
Это также дает понять, что вам придется free
каждую запись копировать позже.
И, хотя он получил широкое распространение, strdup
не является частью стандарта C; поэтому, чтобы быть независимым от платформы, вам нужно написать ...
names[i] = malloc(strlen(nameRow)+1);
strcpy(names[i],nameRow);