Как вернуть массив char из функции c
Перейти к содержимому

Как вернуть массив char из функции c

  • автор:

Как вернуть массив char из функции c

есть функция вида

mssql_read(const char *sql, int* num_cols, char** colnames, field** result)
.
colnames = (char**)malloc((tds->res_info->num_cols)*sizeof(char*));
.
for (i = 0; i < tds->res_info->num_cols; i++) {
colnames[i] = (сhar*)malloc(strlen(tds->res_info->columns[i]->column_name) + 1);
strcpy(colnames[i], tds->res_info->columns[i]->column_name);
}

т.е. память под массив и его элементы выделяется в функции.

все хорошо, только после вызова colnames = 0x0 и вылет по Segmentation fault при обращении по этому указателю, хотя внутри функции colnames равно нормальному адресу.

это gcc само эту память освобождает или как?

если тоже самое, только с использованием глобальной переменной, то все нормально.

подскажите как это побороть.

Оглавление

Сообщения по теме

>есть функция вида
>
>mssql_read(const char *sql, int* num_cols, char** colnames, field** result)
> .
> colnames = (char**)malloc((tds->res_info->num_cols)*sizeof(char*));
>.
> for (i = 0; i < tds->res_info->num_cols; i++) {
> colnames[i] = (сhar*)malloc(strlen(tds->res_info->columns[i]->column_name) + 1);
> strcpy(colnames[i], tds->res_info->columns[i]->column_name);
> }
>
>т.е. память под массив и его элементы выделяется в функции.

В C параметры передаются по значению. Если переменная передана в функцию, ее значение после вызова не изменяется. Для того, чтобы функция смогла изменить значение переменной, нужно передавать указатель на переменную. В вашем случае, сигнатуру вызова надо поменять на
(. char *** colnames, . ),
в теле функции все colnames поменять на *colnames, и вызывать ее так:
char ** colnames;
mssql(. &colnames, . )

Настоятельно рекомендую, вместо этого, завести структуру вроде
struct result {
char ** colnames;
field ** result;
etc
}
и возвращать ее из функции посредством return.

>
>все хорошо, только после вызова colnames = 0x0 и вылет по Segmentation
>fault при обращении по этому указателю, хотя внутри функции colnames равно
>нормальному адресу.
>
>это gcc само эту память освобождает или как?

Память, к слову сказать, никто не освобождает. Указатель на нее, однако, теряется безвозвратно.

>
>если тоже самое, только с использованием глобальной переменной, то все нормально.
>
>подскажите как это побороть.

Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.

Вернуть массив символов через return

Author24 — интернет-сервис помощи студентам

Доброго времени суток. Я сделал массив объектов с помощью класса и нужно устроить поиск по имени. Мне надо перебрать все элементы массива циклом и в случае идентичности переменной key[30] с FullName[30] должен сработать cout. Однако как вернуть FullName и сравнить с key? Через strcmp у меня не получается. Помогите ,пожалуйста.

1 2 3 4 5 6 7
class phonebook { char FullName[30]; public: void initialization(); char get_fullname(); }

Код в файле cpp:

1 2 3 4 5 6 7 8 9 10 11 12
#include "fraction.h" void phonebook::initialization() { std::cin.ignore(); std::cout  "Enter full name: "; std::cin.getline(FullName, 30); } char phonebook::get_fullname() { }

Основной файл:

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
#include #include "fraction.h" int main() { short size=0,position = 0,id; phonebook* peoples = new phonebook[size]; char decision = '9'; while (decision != 'E') { std::cout  "Enter decision(C - create, S - search by full name): "; std::cin >> decision; switch (decision) { case 'C': peoples = (phonebook*)realloc(peoples, (++size) * sizeof(phonebook)); peoples[position++].initialization(); break; case 'S': char key[30],temp[30]; std::cout  "Enter key: "; std::cin.getline(key, 30); for (short i = 0; i  size; i++) { if (strcmp(!peoples[i].get_fullname(), key)==0) { // пытаюсь сделать подобие сравнения. std::cout  "!"; } } break; } } delete[] peoples; return 0; }

Добавлено через 6 минут
Знак ! в проверке лишний, его надо убрать.
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Как вернуть только верхнее значение стека через return
Есть рекурсивная функция, которая возвращает определенное значение. Вопрос — как вернуть только.

Вернуть из функции массив символов
Здравствуйте! Не получается никак решить задачу. Напишите функцию merge, которая соединяет две.

Как из функции вернуть массив символов?
Здравствуйте.Как возвратить массив символов?Читал другие темы,понял что надо создавать динамическую.

Как вернуть два значения через return?
Вот пример. Мне нужно с помощью функции zero записать в х0=0 , а в х1=1. вооооот, вообщем я хз.

1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882

Лучший ответ

Сообщение было отмечено d8veloper как решение

Решение

Надо возвращать указатель.

char* get_fullname();

А ты возвращаешь 1 символ вместо массива.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Можно ли через метод типа int вернуть 2 значения (return)?
Вообщем возникла такая проблема. Создал 2 метода для решения дискриминантного уравнения. Один метод.

Можно ли выводить целый массив из метода через return
В чем проблема? Можно ли выводить целый массив из метода через return?

Не могу через указатель на двумерный массив вернуть все значения в другой массив
Не могу через указатель на двумерный массив вернуть все значения в другой массив возвращается.

Вернуть QString с помощью return
Добрый день . Есть переменная типа string ,как с помощью return вернуть ее туда,откуда вызвалась.

Как из switch вернуть результат return?
Код public string Method1(string str_1) < string s1; .

return как вернуть значение из фукнции?
Всем привет! Есть функция: public void login(string login,string password) < //Здесь идет.

Или воспользуйтесь поиском по форуму:

C++ как вернуть массив типа char из функции

По замыслу эта функция будет открывать файл и считывать от туда данные, после эти данные функция вернёт, а потом я буду решать что с ними делать. Но при компиляции мне выдаёт ошибку:

main.cpp:8:16: error: incompatible types in assignment of 'char*' to 'char* [200]' text_in_file = data.loadData("C://Users//SilentiumNoxe//Documents//Projects//noteCoin//data//savedata.txt"); ^ main.cpp:9:107: error: no matching function for call to 'SaveText::saveData(char* [200], const char [75])' data.saveData(text_in_file, "C://Users//SilentiumNoxe//Documents//Projects//noteCoin//data//outfile.txt"); ^ 

Как правильно вернуть в данной ситуации массив и что значит «Нет подходящей функции для вызова»? P.S. string, vector и пр. не предлагать. Спасибо.

Как из функции вернуть массив символов?

Author24 — интернет-сервис помощи студентам

Здравствуйте.Как возвратить массив символов?Читал другие темы,понял что надо создавать динамическую память,потом удалять её,по другому никак нельзя?Заранее спасибо!

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Вернуть из функции массив символов
Здравствуйте! Не получается никак решить задачу. Напишите функцию merge, которая соединяет две.

Как вернуть массив в данной функции ? Или как записать массив в переменную ?
#pragma once #include "stdafx.h" const int S = 49; int bin2; int decbin(int a, int.

Как вернуть массив из функции?
Изучал массивы в C++, хотел написать функцию которая принимает, изменяет и возвращает массив: .

3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426

Можно не создавать в локальной области, чтобы не возвращать. Именно массив (размер известен на этапе компиляции), или блок данных в динамической памяти?

Регистрация: 28.10.2012
Сообщений: 135
ыыы.
char mas[] = «simbols»;
return mas;
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426

ЦитатаСообщение от nofx Посмотреть сообщение

return mas;
Возвращаешь указатель на то, что исчезнет после выхода из функции.

Эксперт С++

8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760

ЦитатаСообщение от Amir_05_05 Посмотреть сообщение

Как возвратить массив символов?

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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
#include // --- синтаксис передачи массива в функцию. templateclass T, size_t N> void Fill( T (&arr)[N] ) { for(size_t i=0;iN;++i ) arr[i] = i; } // --- синтаксис возвращения массива из функции templateclass T, size_t N> T ( &Get() )[N] { static T arr[N]; return arr; } // --- синтаксис функции, которая принимает массив по ссылке // и возвращает массив по ссылке templateclass T, size_t N> T (&Example( T (&arr)[N] ) )[N] { Fill(arr); auto& dst = GetT,N>(); for(size_t i=0;iN;++i ) dst[i]= arr[i]*10; return dst; } int main() { std::cout  <"Hello, world!\n"; int a[10] = {}; const auto& result = Example(a); std::cout<"int result[10] = ; for(const auto& i: result) std::cout <", "; std::cout <">;\n"; }

Регистрация: 06.06.2015
Сообщений: 240

В общем пишу функцию которая преобразует string в char все работает,осталось просто возвратить char-строку

3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426

ЦитатаСообщение от Amir_05_05 Посмотреть сообщение

которая преобразует string в char
А зачем её преобразовывать в char-строку? У string для этого функция есть: c_str() .
Регистрация: 06.06.2015
Сообщений: 240
Ну имею ввиду в массив символов
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426

ЦитатаСообщение от Amir_05_05 Посмотреть сообщение

осталось просто возвратить char-строку

ЦитатаСообщение от nd2 Посмотреть сообщение

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *