Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我是否必须在SQLITE中对argv回调中的每个参数进行深度复制?_C_Sqlite_Callback_Copy_Memcpy - Fatal编程技术网

C 我是否必须在SQLITE中对argv回调中的每个参数进行深度复制?

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

如果我想在调用回调时存储查询返回的信息,我应该在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_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,这应该足够清楚了。