adressmoeistranici
@adressmoeistranici
Начинающий программист

Почему забилось цп при выполнении программы?

Написана программа, которая дает результат, после идут строки
free(ptr[0]);
free(ptr[1]);
free(ptr[2]);
free(ptr);
//сюда иногда не могу добраться. программа иногда перестает обрабатываться (проц забит)
_getch();
return 0;
почему?
  • Вопрос задан
  • 84 просмотра
Решения вопроса 1
adressmoeistranici
@adressmoeistranici
Начинающий программист
Дмитрий Королев, Ошибка как минимум тут:
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
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы