如何正确重用已分配的指针,因为错误“双重释放或损坏(!prev)”

问题描述 投票:0回答:1

我编写了以下代码来迭代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);已经出现。

我认为,

  1. [buffer,并且buffer_不需要是自由的,因此应该没有问题

  2. 也许是sprintf(query, '\0');或'query ='\ 0';was not a good idea to set the query to NULL, but allocatingchar *用于inside of free(query)`的query and对于应用程序来说不是必需的,不知道是否必要为了避免分配错误。有人知道该怎么做吗?提前致谢。

c linux memory memory-leaks malloc
1个回答
0
投票

我发现了问题。事实证明,分配给query的内存不足。 char *query = malloc(sizeof(char) * (arr1.length * 10 + 200);(此处为arr1.length * 10)表示为arr1.arr_中的每个元素分配10个块。但是添加了,(strcat(query,“,”);),因此每个数字都需要比10+1块更多(在现实生活中,增加了15个字符,而不是我在此处编写的示例中的1个字符) ,因此造成了很大的问题)。

因此,不仅要检查分配变量的方式,而且分配单元的长度也很重要。

© www.soinside.com 2019 - 2024. All rights reserved.