URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 2656
[ Назад ]

Исходное сообщение
"как вернуть char** из функции"

Отправлено kavel , 12-Мрт-04 18:21 
есть функция вида

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

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

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


Содержание

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

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

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