Как возвратить из функции массив?
Есть функция, которая читает строку из файла.
типа
Код:
void fileread(FILE *f, char *readbuff)
А как сделать так чтобы эта функция возвращала эту чтроку. Тоесть передаем ей только указатель на файл, а она возвращает прочитанную строку? Что-то я попробовал и так и сяк - и не добился толка.
Спасибо
функция - меняет эту строку. так что по окончании работы в *readbuf - должна быть измененная строка. можешь считать это возвратом. так работают половина С-шных функций стандартных. кроме того - можно возвращать сам указатель на строку.
Код:
char *fileread(FILE *f, char *readbuff) {
...........................
return readbuff;
}
...........................
return readbuff;
}
Но я имел ввиду следующее, можно ли ту же функцию оформить так
Код:
char *fileread(FILE *f){
.........................
return my_string;
}
.........................
return my_string;
}
Возможно такое вооще, чтоб это можно было не сильно по-извращенски реализовать?
Код:
char *fn()
{
char* in_fn_str;
strncpy(in_fn_str, "abcd", 5);
return in_fn_str;
}
int main()
{
char *str = fn();
printf("%s\n", str);
return 0;
}
{
char* in_fn_str;
strncpy(in_fn_str, "abcd", 5);
return in_fn_str;
}
int main()
{
char *str = fn();
printf("%s\n", str);
return 0;
}
переменая прекрати свое существование, как только программа покинет функцию fn. т.е никто не знает. что будет находится по тому адрессу ,который вернет функция спустя некоторе время.
Цитата: Lone Wolf
естествено нельзя.
переменая прекрати свое существование, как только программа покинет функцию fn. т.е никто не знает. что будет находится по тому адрессу ,который вернет функция спустя некоторе время.
переменая прекрати свое существование, как только программа покинет функцию fn. т.е никто не знает. что будет находится по тому адрессу ,который вернет функция спустя некоторе время.
Это произойдёт, только если массив будет храниться в стеке. А вообще, символьные массивы формируются в "куче".
Код:
char *fileread(FILE *f)
{
char *my_string = (char*) malloc (sizeof (char) * Длина_Строки); // Выделяем область памяти
//.........................
return my_string; // Возвращаем указатель на неё
}
//..............
// Использование без присвоения результата
filedear (File); // Утечка памяти
{
char *my_string = (char*) malloc (sizeof (char) * Длина_Строки); // Выделяем область памяти
//.........................
return my_string; // Возвращаем указатель на неё
}
//..............
// Использование без присвоения результата
filedear (File); // Утечка памяти
Но здесь имеется большие вилы: выделенную память требуется освобождать. А вот с этим очень часто бывают проблемы: достаточно вызвать функцию без явного присвоения результата, и мы получим утечку памяти.
Вообще, то функции, которые в качестве результата возвращают указатели на создаваемые объекты, использовать не рекомендуется. Куда лучше следующий код
Код:
int fileread(FILE *f, char **Data)
{
if (Data)
{
*Data = (char*) malloc (sizeof (char) * Длина_Строки);
// Выделяем область памяти
//.........................
}
return Длина_Строки; // Возвращаем размер
}
//...............
// Использование
char *My_String = NULL; // Объявляем указатель
int Length = FileRead (File, &My_String); // Считываем данные
{
if (Data)
{
*Data = (char*) malloc (sizeof (char) * Длина_Строки);
// Выделяем область памяти
//.........................
}
return Длина_Строки; // Возвращаем размер
}
//...............
// Использование
char *My_String = NULL; // Объявляем указатель
int Length = FileRead (File, &My_String); // Считываем данные
Цитата: Soda
Всем привет.
Есть функция, которая читает строку из файла.
типа
тоесть читает из файла и записывает результат в readbuff.
А как сделать так чтобы эта функция возвращала эту чтроку. Тоесть передаем ей только указатель на файл, а она возвращает прочитанную строку? Что-то я попробовал и так и сяк - и не добился толка.
Спасибо
Есть функция, которая читает строку из файла.
типа
Код:
void fileread(FILE *f, char *readbuff)
А как сделать так чтобы эта функция возвращала эту чтроку. Тоесть передаем ей только указатель на файл, а она возвращает прочитанную строку? Что-то я попробовал и так и сяк - и не добился толка.
Спасибо
Это должен быть C или C++ ?
Если C, то наиболее правильным будет все так же:
Код:
char* fileread(FILE *f, char *readbuff)
{
..................
return readbuff;
}
{
..................
return readbuff;
}
другие варианты будут весьма спорными.
Если ты используешь С++, то можно вернуть объект, например, контейнер или строку:
Код:
string fileread(FILE *f)
{
string str;
..................
return str;
}
vector fileread(FILE *f)
{
vector buff;
..................
return buff;
}
{
string str;
..................
return str;
}
vector fileread(FILE *f)
{
vector buff;
..................
return buff;
}
Хотя в этом случае я бы использовал не FILE, а ifstream.
Все вами сказанное оказалось очень полезным (:
Если через малок, то согласен ничего не освободится, а если просто обьявить. То да, все будет в куче, но по выходе из функции этот участок, будет отмечен как свободный, по этому гарантировать, что в том месте будет нужная информация нельзя.
Цитата: Lone Wolf
2el scorpio
Если через малок, то согласен ничего не освободится, а если просто обьявить. То да, все будет в куче, но по выходе из функции этот участок, будет отмечен как свободный, по этому гарантировать, что в том месте будет нужная информация нельзя.
Если через малок, то согласен ничего не освободится, а если просто обьявить. То да, все будет в куче, но по выходе из функции этот участок, будет отмечен как свободный, по этому гарантировать, что в том месте будет нужная информация нельзя.
Что это было????
Участок в "куче" может быть отмечен как "свободный" только в двумя способами - функцей free или командой delete.