10 / 10 / 5
Регистрация: 30.01.2013
Сообщений: 99
|
||||||
1 | ||||||
Работа с malloc - найти ошибку в коде30.01.2013, 08:17. Показов 1763. Ответов 11
Метки нет Все метки)
(
Всем привет.
Написал программу, которая выделяет память под двумерный массив и сохраняет в него имена. Размер выделяемой памяти зависит от количества и длины слов, которое определяется пользователем. Программка рассчитана на сохранение n-го количества слов, которое также определяется пользователем в начале программы (при запуске). Вот, собственно, и сам код программы:
Спасибо.
0
|
|
30.01.2013, 08:17 | |
Ответы с готовыми решениями:
11
Работа с файлами (найти ошибку в коде) Работа со списками: найти ошибку в коде Работа с файлами в Си, не могу найти ошибку в коде Работа цикла типа while. Найти ошибку в коде |
Модератор
![]() ![]() ![]() ![]() 11718 / 7223 / 1712
Регистрация: 25.07.2009
Сообщений: 13,225
|
||||||
30.01.2013, 09:56 | 2 | |||||
![]() Решение
murtukov, а при компиляции предупреждения читать не нужно? Функция ваша принимает указатель на символ, выделяет память под строку и указатель на эту память пытается тому самому символу присвоить. Внутри main тоже не комильфо. Посмотрите, как у Вас переменная mass определена, и как под неё память выделяется, найдите странность... Ну и куда строки копируются, присмотритесь внимательнее.
0
|
Диссидент
![]() 27349 / 17067 / 3772
Регистрация: 24.12.2010
Сообщений: 38,458
|
||||||
30.01.2013, 11:50 | 3 | |||||
2
|
10 / 10 / 5
Регистрация: 30.01.2013
Сообщений: 99
|
|
30.01.2013, 21:33 [ТС] | 4 |
Байт, спасибо за рабочий вариант кода.
Вот только вопрос: Почему мой код не работает даже после поправки? Было так: mass = (char *)malloc(n*sizeof(char *)); Исправил: mass = (char **)malloc(n*sizeof(char *)); И все равно не работает. Ясно, что дело в кривонаписанной функции, но в чем конкретно? Могли бы вы мне объяснить, что именно происходит в моей функции? Спасибо. Добавлено через 49 минут А, все, разобрался. easybudda, Код у меня не такой уж и кривой, нужно было всего лишь звездочку вставить в двух местах, а именно: тут - void memory_for_string(char **mass, int m) и тут - mass = (char **)malloc(n*sizeof(char *)); И все работает. Зачем нужно было писать целый новый код с новыми названиями переменных? - Что вредного в явном приведении типа, что возвращает malloc? Как раз таки наоборот - без его указания код может и вовсе не скомпилироваться, так как malloc возвращает void по умолчанию и не все компиляторы делают конвертирование типа. Встречался с подобным. - Все у меня правильно там копируется Спасибо всем, вопросов больше нет, тема закрыта.
0
|
Модератор
![]() ![]() ![]() ![]() 11718 / 7223 / 1712
Регистрация: 25.07.2009
Сообщений: 13,225
|
|
30.01.2013, 23:19 | 6 |
Да ну?!
Все С компиляторы приводят void * к нужному типу автоматически, все С++ компиляторы этого принципиально не делают. Не компилируйте код С, как С++, и будет Вам счастье. Как и чем в вашей IDE компилируются программы - ищите в настройках IDE. Может привести к трудноуловимой ошибке. Подробности - Роберт Лав "LINUX системное программирование", глава 8, раздел "Выделение динамической памяти".
0
|
![]() 5053 / 3114 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
|
|
31.01.2013, 13:53 | 8 |
Лучше не стоит. Компилятор в 100% случаев приведёт void * к правильному типу, а вот программист...
0
|
Форумчанин
![]() ![]() 8194 / 5044 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|
31.01.2013, 22:34 | 9 |
silent_1991, С++ компилятор не приведет, в том то и дело, ну а программист должен быть совсем ту-ту, чтобы ошибиться в типе, указанном в начале строки.
Хотя дело спорное. Не по теме: Спасибо за книжку, почитаем-с)
0
|
![]() 5053 / 3114 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
|
|||||||||||
01.02.2013, 10:12 | 10 | ||||||||||
![]() Решение
Ну так а речь-то именно о С. Вообще, есть хороший пример, как раз с маллоком, которого я придерживаюсь:
1
|
Модератор
![]() ![]() ![]() ![]() 11718 / 7223 / 1712
Регистрация: 25.07.2009
Сообщений: 13,225
|
|||||||||||
01.02.2013, 10:38 | 11 | ||||||||||
![]() Решение
silent_1991, есть ещё "классический" подход - объявлять по своему типу для всего подряд:
2
|
![]() 5053 / 3114 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
|
|
01.02.2013, 12:27 | 12 |
easybudda, согласен, тоже вариант.
0
|
01.02.2013, 12:27 | |
Помогаю со студенческими работами здесь
12
Найти и исправить ошибку в коде (работа с указателями) Работа с файлами: запись, добавление, чтение (найти ошибку в коде) Двумерный массив. Поиск нулей.Не могу найти ошибку ошибку в коде
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |