Здесь:
arr[idx] = calloc(32, sizeof(char));
arr[idx] = "sample text";
Вы выделяете 32 байта памяти и сохраняете указатель на них в arr[idx]
, затем вы перезаписываете этот указатель указателем на массив, представленный строковым литералом. Динамическое распределение просочилось. Кроме того, позднее вы вызываете неопределенное поведение, когда пытаетесь освободить пространство, на которое указывает элемент массива, потому что указатель, сохраненный в массиве, не был получен ни от одной из функций распределения.
Предположительно, вы хотели скопировать содержимое строки в выделенное пространство вместо того, чтобы перезаписать указатель на пространство. Для этого вы хотите strcpy()
.
arr[idx] = calloc(32, sizeof(char));
// Note: an error check really ought to be performed here
strcpy(arr[idx], "sample text");