C 我是否必须在SQLITE中对argv回调中的每个参数进行深度复制?
如果我想在调用回调时存储查询返回的信息,我应该在argv中对每个参数进行深度复制,还是可以安全地假设sqlite3在从回调返回后不会释放它?我用C作为编程语言C 我是否必须在SQLITE中对argv回调中的每个参数进行深度复制?,c,sqlite,callback,copy,memcpy,C,Sqlite,Callback,Copy,Memcpy,如果我想在调用回调时存储查询返回的信息,我应该在argv中对每个参数进行深度复制,还是可以安全地假设sqlite3在从回调返回后不会释放它?我用C作为编程语言 static int callback_consult(void *dummy, int argc, char **argv, char **col_name) { res_consult_t * answer = &(global_answer -> consult_res); movie_t *curr_tupl
static int callback_consult(void *dummy, int argc, char **argv, char **col_name) {
res_consult_t * answer = &(global_answer -> consult_res);
movie_t *curr_tuple = calloc(sizeof(char), sizeof(movie_t));
/* Should I memcpy ??? */
curr_tuple -> name = argv[0];
curr_tuple -> genre = argv[1];
curr_tuple -> description = argv[2];
curr_tuple -> seats_available = argv[3]; /* Convert to int */
(answer -> movies)[tuple] = curr_tuple;
return SQLITE_OK;
}
我猜您是在问传递给
sqlite3\u exec()
的回调函数可以安全地做什么
首先,sqlite3\u exec()的文档说:
sqlite3_exec()回调函数的第三个参数是指向字符串的指针数组,这些字符串是从sqlite3_column_text()中获得的,每列一个指针。如果结果行的元素为空,则sqlite3_exec()回调对应的字符串指针为空指针
一般来说,您确实需要准备好将结果列设置为NULL
。将此类NULL
s赋值给程序中的任何特定变量、结构或联合成员或数组元素是否安全或合适是程序的一个特征。当然,将NULL
作为参数传递给memcpy()
或strcpy()
是不安全的,因此您可能需要对此进行说明
但是,sqlite3\u column\u text()的文档触及了问题的实质。这尤其适用于:
返回的指针在发生如上所述的类型转换之前有效,或者在调用sqlite3_step()或sqlite3_reset()或sqlite3_finalize()之前有效。用于保存字符串和blob的内存空间将自动释放
自
sqlite3_exec()接口是围绕sqlite3_prepare_v2()、sqlite3_step()和sqlite3_finalize()[…]的方便包装
总的结论是,通过参数argv
传递到回调函数中的字符串只有在回调返回之前才可用。如果你想保存这些结果以备日后处理,那么你需要复制,或者以其他方式从中提取所需的数据。我想我知道你在问什么,但如果你提供示例C代码,问题会更清楚。我刚刚添加了代码@JohnBollinger,这应该足够清楚了。