В вашем коде есть несколько ошибок / несоответствий, но первая из них - неправильная sizeof
в первом выделении. Ошибку, которую вы допустили, можно было легко избежать, если бы вы следовали рекомендациям по надлежащей практике:
(1) По возможности избегайте использования имен типов в инструкциях . Имена типов принадлежат объявлениям , а не операторам.
(2) Не приводить результат функций выделения памяти.
Первое распределение должно было выглядеть следующим образом
char **ptr = malloc( 8 * sizeof *ptr );
Постарайтесь запомнить это как общий шаблон: malloc
запросы должны обычно выглядеть следующим образом
pointer = malloc( count * sizeof *pointer );
Примечание. Имена типов не упоминаются в приведенном выше утверждении.
Конечно, вы также должны принять решение о первом размере вашего 2D-массива. Вы пытаетесь выделить 8, а затем инициализируете только 3. Почему?