Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
1 / 1 / 0
Регистрация: 12.04.2014
Сообщений: 61

Заполнение массива структур - при вводе более двух элементов возникает ошибка

15.10.2014, 01:43. Показов 2379. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача: создать массив структур и заполнить с клавиатуры (произвольной длины).
Подскажите пожалуйста, в чем ошибка. При вводе больше 2 строк (создание больше 2 элементов массива структур) - выдает ошибку. При вводе 1-2 строк, вместо введенных строк, заполняет строками "end".
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
struct StrAndN
{
    char* str = (char*)malloc(sizeof(str));
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "");
 
    char* str = (char*)malloc(sizeof(str)); // объявление строки
    struct StrAndN* masStr1 = (StrAndN*)malloc(sizeof(*masStr1)); // объявление массива структур
 
    int nStr1 = 0; // счетчик
    // заполнение массива структур с клавиатуры
    puts("Заполнение массива структур: (end для завершения ввода)");
    while (true)
    {
        scanf("%s", str);
        if (0 == strcmp(str, "end")) break; // выход из цикла, если введена строка end
        masStr1[nStr1].str = str;
        nStr1++;
    }
 
    // проверка заполненной структуры
    for (int i = 0; i < nStr1; i++)
    {
        puts(masStr1[i].str);
    }
    return 0;
}
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.10.2014, 01:43
Ответы с готовыми решениями:

Возникает ошибка в программе при вводе нуля
Нажимаю 0 возникает ошибка в программе , хотя компилятор молчит. #include &lt;iostream&gt; using namespace std; struct d; d* head =...

При вводе значения в программу возникает ошибка exitcode=216
есть программа, при вводе значения в программу она завершает свое действие и появляется окошко %disk%:\%путь к...

Почему возникает ошибка при определении числа элементов массива?
Привожу проблемный участок кода $otbor=array(); IF (!empty($otbor)) { $index=count($otbor); $where0='where'; for ($i = 0; $i...

3
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
15.10.2014, 02:06
Zimos,
1) Не надо инициализировать значения полей структуры в объявлении структуры. Если не ошибаюсь, в C такое запрещено (в C++11 есть эта возможность), но даже если компилятор так позволяет - в данном случае это не верно.

2)
Цитата Сообщение от Zimos Посмотреть сообщение
C
1
2
char* str = (char*)malloc(sizeof(str)); // объявление строки
* * struct StrAndN* masStr1 = (StrAndN*)malloc(sizeof(*masStr1)); // объявление массива структур
как ты думаешь, чему равно sizeof(str) и sizeof(*masStr1)?

3)
Цитата Сообщение от Zimos Посмотреть сообщение
C
1
masStr1[nStr1].str = str;
нельзя так присваивать одну строку другой. Используй функцию strcpy.
1
1 / 1 / 0
Регистрация: 12.04.2014
Сообщений: 61
15.10.2014, 18:43  [ТС]
Спасибо. Только я первый пункт не понял, я же инициализирую потом с помощью strcpy.

2) поменял на
C
1
2
char* str = (char*)malloc(sizeof(char*)); // объявление строки
struct StrAndN* masStr1 = (StrAndN*)malloc(sizeof(struct StrAndN*));
3) поменял на
C
1
strcpy(masStr1[nStr1].str, str);
Теперь вылетает сразу после ввода первой строки. Подскажите пожалуйста, что еще исправить.
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
15.10.2014, 22:16
Цитата Сообщение от Zimos Посмотреть сообщение
Только я первый пункт не понял
в 3 строчке malloc убрать.
Цитата Сообщение от Zimos Посмотреть сообщение
я же инициализирую потом с помощью strcpy
не правильно инициализируешь
Цитата Сообщение от Zimos Посмотреть сообщение
(char*)malloc(sizeof(char*));
sizeof(char*) равен 4 или 8 (зависит от платформы), т.е. тут ты выделяешь память по строку длиной 3 (или 7) символов + символ конца строки
Цитата Сообщение от Zimos Посмотреть сообщение
(StrAndN*)malloc(sizeof(struct StrAndN*))
то же самое, массив из 4 (8) структур

Еще динамически выделенную память нужно освобождать, а в коде нет ни одного вызова функции free
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.10.2014, 22:16
Помогаю со студенческими работами здесь

Ошибка при вводе элементов массива и нажатии клавиши
Программа запускается но при вводе элементов массива и нажатии клавиши Решения выдает ошибку....?#include &lt;vcl.h&gt; #pragma hdrstop ...

Неверная обработка данных при вводе двух и более величин
У меня по коду все правильно, при вводе одного значения n вывод верный. Если ввод включает 2 и больше значений n, то первое значение,...

При вводе более двух студентов программа выдает ошибку
программу начал делать для сортировки списка студентов, сделал процедуры ввода и вывода списка студентов при вводе более двух студентов...

При распаковки архиватором 7-zip sfx файлов объемом более 100 ГБ возникает ошибка
Добрый день. Возникла проблема. Каждую неделю делаются бэкапы данных архивирую в sfx файлов с помощью 7zip. Возникла потребность...

При вводе данных в программу возникает ошибка "индекс вне диапазона"
При вводе данных в программу вылетает ошибка &quot;индекс вне диапазона&quot;.Помогите исправить пожалуйста. Вот текст программы CLS PRINT :...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru