Ответы пользователя по тегу C
  • Как создать массив из типов данных в си?

    adressmoeistranici
    @adressmoeistranici
    Делатель
    enum typeid { ...}; упоминания типов
    индексация упоминаниями ассоциированного массива размеров не лишнее
    и конечно явные преобразования данных по месту в switch или через union
    Nulltiton, в само перечисление нужно вставить список перечислителей - для области видимости, чтобы их использовать в качестве упоминаний о типе
    например назвать enum typeid { int_identity=0, bool_identity, и другие }
    каждый чайник знает, а Вы подумали что я предлагаю новую форму синтаксиса с эллипсисом

    а в массиве размеров индексация может быть проведена sizes[(size_t)typeid.int_identity]
    Ответ написан
    2 комментария
  • Почему забилось цп при выполнении программы?

    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
    Ответ написан
    Комментировать
  • Как вызвать scanf повторно?

    adressmoeistranici
    @adressmoeistranici Автор вопроса
    Делатель
    fflush(stdin);
    Ответ написан
    Комментировать