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

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

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