Я некоторое время не работал с OCI, но, насколько я помню, тип text *
- это просто обычный символьный указатель.Это означает, что вы пытаетесь скопировать некоторый текст в указатели, которые не были инициализированы.
Сейчас вы пишете в память, указанную uname
, pwd
и connstr
, не выделяя для них память,Это перезаписывает любую память, с которой можно было начать, и неопределенное поведение.
Либо вы просто хотите использовать указатели, в этом случае вы указываете их на соответствующий массив, либо объявляете их как массивы и копируетев них.
Первое решение:
text *uname = (text *) username.arr;
text *pwd = (text *) password.arr;
text *connstr = (text *) tnsname.arr;
printf ("username is %s \n",uname);
printf ("password is %s \n",pwd);
printf ("connstr is %s \n",connstr);
Второе решение:
text uname[UNAME_LEN];
text pwd[PWD_LEN];
text connstr[32];
strncpy (uname, username.arr,UNAME_LEN);
strncpy (pwd, password.arr,PWD_LEN);
strncpy (connstr,tnsname.arr,32);
printf ("username is %s \n",uname);
printf ("password is %s \n",pwd);
printf ("connstr is %s \n",connstr);
Для второго решения вы можете сохранить переменные text
в качестве указателейи используйте malloc
для выделения памяти для них, но тогда вам нужно free
этой памяти, когда вы закончите с ней.
Я также хотел бы поднять проблему с вашим использованием strncpy
,Если исходные строки длиннее длины, которую вы копируете (т. Е. strlen(username.arr) > UNAME_LEN
), то строка назначения будет , а не прервана.Возможно, вам нужно сделать что-то вроде этого:
strncpy (uname, username.arr, UNAME_LEN);
uname[UNAME_LEN - 1] = '\0';