>есть функция вида
>
>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 само эту память освобождает или как?
Память, к слову сказать, никто не освобождает. Указатель на нее, однако, теряется безвозвратно.
>
>если тоже самое, только с использованием глобальной переменной, то все нормально.
>
>подскажите как это побороть.