row = malloc(argc * sizeof (int));
Это должно быть изменено на:
row = malloc(argc * sizeof (int *));
Поскольку вы выделяете новый целочисленный массив для каждого элемента в «строке» и, следовательно, каждый элемент в «строке» должен быть целочисленным указателем, чтобы он содержал адрес, который указывает на массив целых чисел.
Кроме того, вы освобождаете память неправильно.
for (int i = 0; i < argc; i++) {
for (int j = 0; j < col[i]; j++) {
int* currentIntPtr = row[i][j];
free(currentIntPtr);
}
}
Этот фрагмент кода не будет работать:.
int* currentIntPtr = row[i][j];
тип строки [i] [j] является целочисленным типом, и вы присваиваете его целочисленному указателю. Для этого вместо освобождения строки [i] [j] потребуется значение строки [i] [j], попытка освободить этот адрес, который может быть вне адресного пространства программы и, следовательно, не разрешен, и, следовательно, ошибка сегментации.
Соответствующее, которое будет работать, будет:
for (int i = 0; i < argc; i++) {
int* currentIntPtr = row[i];
free(currentIntPtr);
}