The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"как вернуть char** из функции"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"как вернуть char** из функции"
Сообщение от kavel emailИскать по авторуВ закладки on 12-Мрт-04, 18:21  (MSK)
есть функция вида

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 само эту память освобождает или как?

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

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "как вернуть char** из функции"
Сообщение от vnp emailИскать по авторуВ закладки on 12-Мрт-04, 21:28  (MSK)
>есть функция вида
>
>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 само эту память освобождает или как?

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

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


  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

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




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру