Re[3]: Передача указателя на строку из массива
От: cencio Украина http://ua-coder.blogspot.com
Дата: 19.08.03 15:48
Оценка: 14 (1) +1
Здравствуйте, _aptyp_, Вы писали:

_>>Здесь buf локальная переменная, память под которую выделена в стеке. Передавая указатель на нее за пределы функции он перестает быть валидным, так как по завершении функции, buf была удалена. Лучше буэт buf = new char[xxx];

__>А что, нельзя из ф-ии передать переменную по значению, т.е. не по ссылке? Или обязательно использовать кучу или malloc?

В С масивы по значению не передаются, когда ты передаеш масив в функцию то получаеш адрес его начала(весь код который ты привел выше можно считать написаным на чистом С(и лучшее что с ним можно сделать, это сразу выкинуть — посмотри внимательнее что возвращается из функции split, и как ты работаеш с указателями), поэтому для начала желательно временно забыть про такое понятие как "ссылка", оно тебя только запутывает, и помнить только об указателях и масивах. Потом тебе ОБЯЗАТЕЛЬНО НАДО прочитать главу из класической книги Кернигана и Ричи про работу со строками в С(то что доктор прописал ). Без понимания что такое указатели и масивы на С лучше не писать. Мне кажется все проблемы у тебя со строчкой
void substr(char* result[],char* src,int st,int end)
первый параметер наверное задумывался как строка, а получился массив строк , фактически char* result[] еквивалентно char**. и тогда *result=buf; просто запишет один указатель в первую позицию этого масива.

Насчет того как возвращать такие данные из функции — есть 2 варианта:
1. Можно передавать в функцию буффер(и его размер) в который она сможет записать результат
2. Можно всередине функции выделять память под возвращаемые параметры, но тогда надо не забывать ее освобождать после вызова, при таком подходе гарантирован поиск memory leaks в программе

_>>А вообще, зачем изобретать велосипед. Для этого все уже написано и не раз. CRT — strcat, STL — string, ATL — CString

__>strcat — конкатенация, а мне надо разломать строку на подстроки, расположенные м-у опр. символом.
посмотри библиотечную функцию strtok, она делает то что тебе нужно
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.