1 / 1 / 0
Регистрация: 08.04.2012
Сообщений: 100
|
|
1 | |
Выделение памяти для строки символов08.04.2012, 15:52. Показов 15126. Ответов 4
Метки нет (Все метки)
Нужно выделить память под массив указателей на строки, ввести текст построчно динамически выделяя память для каждой строки и записывая указатель в массив.
Ошибка в строке выделения памяти: Необработанное исключение типа "System.NullReferenceException" произошло в c7laba.exe Дополнительные сведения: Ссылка на объект не указывает на экземпляр объекта.
0
|
08.04.2012, 15:52 | |
Ответы с готовыми решениями:
4
Выделение памяти для строки Динамическое выделение памяти для строки Динамическое выделение памяти для строки Выделение нужного количества памяти для строки |
08.04.2012, 16:45 | 2 | |||||||||||||||||||||||||
что, сложно код в сообщение вставить.
Ты не выделил память под массив строк, и сразу стал выделять в цикле память для каждой строки надо так
1
|
1 / 1 / 0
Регистрация: 08.04.2012
Сообщений: 100
|
|
08.04.2012, 17:16 [ТС] | 3 |
Спс большое ... все учту. Очистку памяти не вставлял потому что там у меня тоже была ошибка и код не компилировался. И про использование амперсанда можно подробнее? Когда его нужно вставлять. Почему в моем случае указатель уже есть ?
0
|
08.04.2012, 19:13 | 4 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Амперсант - это операция получения адреса
каждая переменная в программе расположена по своему адресу. Обычно мы обращаемся к ним по значению, например int a; a=5; Но когда мы передаём их по значению в качестве параметра функции, функция не может их изменить Например, напишем функцию получения половиы числа
Функция scanf работает по-другому. Она должна изменять значения переменных. Что для этого нужно? Передача параметров по адресу! Для работы с адресами в Си существуют специальный тип переменных - указатели. Они объявляются как обычная переменная того типа, на который они указывают, но только вот так int* p;//это указатель на int Предназначены они для хранения адресов переменных. Чтобы получить от какой-то переменной адрес используется оператор & Например
Он смог принести в нашу функцию адрес того реального a, оставшегося в главной функции, а не его копии, тем самым, мы смогли изменить переменную, не находясь в её области видимости. Этот приём и использует функция scanf("%d", &a); когда откуда-то из глубины stdio.h изменяет значение переменной в нашей программе, на то, что ввёл юзер. Теперь про строки и массивы строк и чтение строк и вывод строк. Строки в Си это массивы символов, то есть строку мы храним в массиве
То есть записи
равно как и
scanf("%s", stroka); без оператора & ??? Потому что stroka это уже адрес массива stroka[0] и не нужно брать адрес адреса! Теперь про динамические массивы. Часто случается, что мы не знаем, сколько будет в массиве элементов. Например, мы не знаем количество строк, которые введёт пользователь, и поэтому спрашиваем у него. А значит размер массива нам тоже неизвестен, у нас нет готового куска памяти размером 80*N Мы можем взять только указатель char* p; , который ни на что валидное не указывает. Для того чтобы, например, спросить у юзера сколько памяти выделить под строку, а затем создать массив этого размера можно использовать функцию malloc() В скобках надо указать количество байт, какое мы хотим выделить
После работы с динамическим массивом, память нужно освободить. Это крайне важно в больших программах, потому что в процессе работы куча будет заполняться, динамическими массивами, которые после окончания работы не освобождены, и находясь в куче не дают выделять новые куски памяти освобождается память функцией free(s); Теперь, что делать, если нужна не одна строка, а их массив нужно массив строк объявить как указатель на первую строку в массиве, а первая строка в массиве это указатель на первый символ в строке поэтому объявляем указатель на указатель char **p; выделяем массив из N строк как массив указателей
поэтому под них тоже надо выделить память в цикле
Удаляется память, выделенная malloc, как ты помнишь функцией free() но прежде чем делать free(p), надо освободить результат работы N штук маллоков, вызванных нами поэтому полная версия освобождения памяти выглядит так
1
|
1 / 1 / 0
Регистрация: 08.04.2012
Сообщений: 100
|
|
09.04.2012, 19:36 [ТС] | 5 |
Спасибо большое.
0
|
09.04.2012, 19:36 | |
09.04.2012, 19:36 | |
Помогаю со студенческими работами здесь
5
Выделение памяти в куче для строки для реализации длинной арифметики Выделение и удаление памяти, выделенной для динамической строки Строки и символы, выделение памяти Динамическое выделение памяти под строки Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |