2017-02-16 4 views
1

У меня есть следующее сомнение:возвращение sqlite3_column_text() для символьной строки

Рассмотрит ОТБОРНЫЙ со следующей таблицей из SQLite базы данных:

id | label 
1 | P1 
1 | P2 
1 | P3 
1 | P4 

я запускаю следующий код теста:

const unsigned char * new1; 
const unsigned char * new2; 
const unsigned char * new3; 
const unsigned char * new4; 

sqlite3_step(stmt); 
new1=sqlite3_column_text(stmt,1); 

sqlite3_step(stmt); 
new2=sqlite3_column_text(stmt,1); 

sqlite3_step(stmt); 
new3=sqlite3_column_text(stmt,1); 

sqlite3_step(stmt); 
new4=sqlite3_column_text(stmt,1); 

printf("%s\n%s\n%s\n%s\n",new1,new2,new3,new4); 
printf("%p\n%p\n%p\n%p\n",new1,new2,new3,new4); 

И я получаю:

P4 
P4 
P4 
P4 
0x1d5b7f8 
0x1d5b7f8 
0x1d5b7f8 
0x1d5b7f8 

Я хочу напечатать

P1 
P2 
P3 
P4 
Address1 
Address2 
Address3 
Address4 

Есть ли способ, чтобы напечатать это только строковый литерал без использования значения обугленного буфера константного [N] ;, зЬгсра и т.д ...?

ответ

3

Указатели, возвращаемые действительны до тех пор, преобразование типа не происходит, как описано выше, или до sqlite3_step() или sqlite3_reset() или sqlite3_finalize() вызывается. Объем памяти, используемый для хранения строк и BLOB, освобождается автоматически.

Если вы printf после каждого sqlite3_column_text (адрес по-прежнему будет такой же, даже тогда), вам не нужно делать копии.

Смежные вопросы