我编写了以下代码来迭代sqlite3
中的某些查询,但出现了错误double free or corruption (! prev)
。
struct Arr{
int length;
int *arr_;
};
void getValues(sqlite3 conn, struct Arr arr1, struct Arr arr2, int *values){
int i, j, k;
int state, nrow, ncolumn;
char **res;
char *err_msg = 0;
// to build query like "select * from table1 where value1 in (1,2,3...) and value2 = 100;"
char *query = malloc(sizeof(char) * (arr1.length * 10 + 200);
for(i=0l i<arr1.length; i++){
strcpy(query, "select * from table1 where value1 in (");
for(j=0; j<arr2.length; j++){
char buffer[sizeof(char) * (int)(ceil(log10(arr1.arr_[j]+1)))];
sprintf(buffer, "%d", arr1.arr_[j]);
strcat(query, buffer);
if(j == arr1.length - 1){
strcat(query, " ) and values2 = ");
char buffer_[sizeof(char) * (int)(ceil(log10(arr2.arr_[i]+1)))];
sprintf(buffer_, "%d", arr2.arr_[i]);
strcat(query, buffer_);
strcat(query, ";");
}else
strcat(query, " , ");
}
printf("query: %s\n", query);
state = sqlite3_get_table(conn, query, &res, &nrow, &ncolumn, &err_msg);
sprintf(query, '\0');
}
free(query)
}
原来,可以正确打印查询,但是即使在打印所有查询之后,即使我注释了double free or corruption (! prev)
,仍然出现相同的错误,但错误state = sqlite3_get_table(conn, query, &res, &nrow, &ncolumn, &err_msg);
已经出现。
我认为,
[buffer
,并且buffer_
不需要是自由的,因此应该没有问题
也许是sprintf(query, '\0');
或'query ='\ 0';was not a good idea to set the query to NULL, but allocating
char *用于inside of
free(query)`的query and
对于应用程序来说不是必需的,不知道是否必要为了避免分配错误。有人知道该怎么做吗?提前致谢。
我发现了问题。事实证明,分配给query
的内存不足。 char *query = malloc(sizeof(char) * (arr1.length * 10 + 200);
(此处为arr1.length * 10
)表示为arr1.arr_
中的每个元素分配10个块。但是添加了,
(strcat(query,“,”);),因此每个数字都需要比10+1
块更多(在现实生活中,增加了15个字符,而不是我在此处编写的示例中的1个字符) ,因此造成了很大的问题)。
因此,不仅要检查分配变量的方式,而且分配单元的长度也很重要。