openlang

Ввод массивов символов через указатели

Когда пытаюсь вводить с клавиатуры данные в массивы char, программа каждый раз падает.

Как можно удобно считывать с клавиатуры массивы char и сохранять их?

int main() {
    int pos;
    char *labels[8];
    for (pos=0; pos<8; ++pos) {
        scanf("%s",labels[pos]);
    }
    for (pos=0; pos<8; ++pos) {
        printf("%s\n",labels[pos]);
    }
    return 0;
}
Переведено с английскогоПоказать оригинал

Разговор продолжается 2

Следуя доводам
  1. Ссылка на ответ

    Объявление char *labels[8] создаёт массив указателей. Без инициализации корректным адресом эти указатели обозначают недопустимые участки памяти. Поэтому попытка записи через них приводит к неопределённому поведению.

    Перед использованием указателей убедитесь, что они ссылаются на действительные участки выделенной памяти.

    Переведено с английскогоПоказать оригинал
  2. Ссылка на ответ

    Это массив указателей на char, но эти указатели не ссылаются на корректную память.

    Сначала выделите для них память:

    int main(void)
        int pos;
        char *labels[8];
        for (pos=0; pos<8; ++pos) {
            labels[pos]=malloc(LABELCAP);
            scanf("%17s",labels[pos]);
        }
        for (pos=0; pos<8; ++pos) {
            printf("%s\n",labels[pos]);
            free(labels[pos]);
        }
        return 0;
    }

    другой вариант

    int main(void) {
        int pos;
        char labels[8][LABELCAP];
        for (pos=0; pos<8; ++pos) {
            scanf("%17s",labels[pos]);
        }
        for (pos=0; pos<8; ++pos) {
            printf("%s\n",labels[pos]);
        }
        return 0;
    }
    Переведено с английскогоПоказать оригинал

Другие стороны того же вопроса

  1. Один и тот же вызов с sink, сначала копия, потом перенос

    Nim 2 решает, копировать или переносить, в каждой точке вызова. Не на уровне proc. Тот же аргумент, та же proc. Первый вызов…

    Ответы 2Последняя активность nim
  2. Отложить изменяемое заимствование блока очистки до его исполнения

    Как написать в Rust устойчивую к панике конструкцию, похожую на Java try { ... } finally { ... }, чтобы блоки try и finally м…

    Ответы 2Последняя активность rust
  3. Может ли функция ввода обойтись без глобальных переменных?

    Хочу написать функцию, которая обрабатывает пользовательский ввод, фильтрует его и возвращает полученную строку вызвавшей её…

    Ответы 2Последняя активность c