c - 如何正确重用分配的指针,因为错误“双重释放或损坏(!prev)”
问题描述
我编写了以下代码以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');
或'查询='\ 0';was not a good idea to set the query to NULL, but allocating
char *queryinside of
forand
free(query)` 对于应用程序来说不是必需的,不知道是否有必要避免分配错误。任何人都知道如何正确地做到这一点?提前致谢。
解决方案
我发现了问题。事实证明,分配给的内存query
是不够的。char *query = malloc(sizeof(char) * (arr1.length * 10 + 200);
,这里的arr1.length * 10
,意味着为 中的每个元素分配 10 个块arr1.arr_
。但是添加了一个,
(strcat(query," , ");) ,所以10+1
每个数字都需要比块(在现实生活中,添加了 15 个以上的字符,而不是我在这里写的示例中的 1 个,所以造成了很大的问题)。
因此,不仅要检查分配变量的方式,还要检查分配单元的长度。
推荐阅读
- react-native - 无法在 React Native App 中添加多个统一游戏
- c# - 代码.net核心的顺序应该是什么?
- c# - 如果 WPF 中已经有内容,我如何跳过第一个按钮?
- php - 所以......目标类不存在......好吗?
- javascript - 使用 render_template 将数据从 Flask 发送到 javascript
- html - 如何折叠所有打开的选择器或 html 元素
- mysql - Colesce 和内连接
- c++ - mktime() 在调用时重新分配堆内存
- flutter - 如何在 Catch Block 中使用 Flutter AlertDialog?扑
- scala - 如何在 (x)ubuntu 20.04 上安装独立的 Scala Spark