Дмитрий Королев, Ошибка как минимум тут:
ptr = (char**)malloc(3);
Сразу бросилось в глаза.
С чего вы взяли, что указатель имеет размер 1 байт.
Если что в malloc передается размер в байтах памяти, которую нужно выделить.
У вас массив из трех элементов, каждый элемент имеет размер: sizeof(*ptr)
Вызов малок должен быть таким:
ptr = (char**)malloc(sizeof(*ptr) * 3);
Вот так строки в Си не присваиваются:
ptr[0] = "1001.01\0";
ptr[1] = "11.1\0";
Если вам нужно эти строки скопировать в буфер, который вы выделили вызовами malloc для ptr[0] и ptr[1], то нужно использовать memcpy:
memcpy(ptr[0], "1001.01", 7 );
И в конце строковых литералов не нужно принудительно выставлять \0 - он там автоматически поставится компилятором, просто надо учитывать наличие этого 0 в конце строк.
Вот этим:
ptr[0] = "1001.01\0";
ptr[1] = "11.1\0";
вы теряете буфер, который выше выделили mallocом и потом передаете адрес константы во free, который от этого факта сходит с ума :-)
Собственно, подтвердилось мое предположение в первом посте.
да, для строк не memcpy, а strcpy лучше подойдет.
Но memcpy то же сделает что нужно, просто strcpy ориентировани именно на работу со строками, он определяет конец копирования по символу \0 в конце входной строки.
memcpy - более универсальная, ею можно копировать любой участок памяти, только нужно самому позаботится о том что бы передать правильный размер в функцию.
res2001