C valgrind reporting“;大小为8的写入无效”;
我正在寻找内存分配的分段错误,所以我决定用valgrind运行我的应用程序。在一个意外的位置(但可能相关),我遇到了“大小为8的无效写入”。但是,我看不出代码有任何错误。我希望能再多看一眼 我不确定要提供多少,所以这里是有问题的函数C valgrind reporting“;大小为8的写入无效”;,c,sqlite,valgrind,C,Sqlite,Valgrind,我正在寻找内存分配的分段错误,所以我决定用valgrind运行我的应用程序。在一个意外的位置(但可能相关),我遇到了“大小为8的无效写入”。但是,我看不出代码有任何错误。我希望能再多看一眼 我不确定要提供多少,所以这里是有问题的函数 43 static int sql_callback(void *sql_record, int argc, char **argv, char **azColName){ 44 int i; 45 SQL_INFO *sql_info; 46 void
43 static int sql_callback(void *sql_record, int argc, char **argv, char **azColName){
44 int i;
45 SQL_INFO *sql_info;
46 void *sql_temp;
47 sql_info = (SQL_INFO *)sql_record;
48
49
50 sql_info->num_cols=argc;
51
52 sql_info->sql_data=(SQL_DATA**)realloc(sql_info->sql_data,(sql_info->num_rows+1)*sizeof(SQL_DATA *));
53 sql_info->sql_data[sql_info->num_rows]=calloc(1,sizeof(SQL_DATA *));
54
55 sql_info->sql_data[sql_info->num_rows]->col_name=calloc(1,sizeof(*azColName)*argc);
56 sql_info->sql_data[sql_info->num_rows]->data=calloc(1,sizeof(*argv)*argc);
57
58 for(i=0; i<argc; i++){
59 sql_info->sql_data[sql_info->num_rows]->col_name[i]=strdup(azColName[i]);
60 sql_info->sql_data[sql_info->num_rows]->data[i]=strdup(argv[i]);
61 }
62 sql_info->num_rows++;
63 return 0;
64 }
因此,我正在使用sqlite3库,这个回调函数正在构建一个记录集数组。数组内部是一个数组,如果该数组包含数据,则为“data”变量。
我对col_name做了类似的事情,但valgrind对此没有意见,也没有抱怨。在这一行:
53 sql_info->sql_data[sql_info->num_rows]=calloc(1,sizeof(SQL_DATA *));
您应该分配sizeof(SQL\u数据)
因为在接下来的语句中,您开始访问sql\u info->sql\u数据[sql\u info->num\u rows]
,就好像它是一个sql\u数据
对象一样:
55 sql_info->sql_data[sql_info->num_rows]->col_name=calloc(1,sizeof(*azColName)*argc);
56 sql_info->sql_data[sql_info->num_rows]->data=calloc(1,sizeof(*argv)*argc);
这正是Valgrind所抱怨的。您可以通过对分配给的变量使用
sizeof
而不是命名类型来避免此类错误:calloc(1,sizeof*sql\u info->sql\u data[0])
ugh。正确的。分配数据的大小,而不是指针的大小。我还在第52行做了更改。这把它清理干净了。看起来我仍然有我的seg故障,但至少这是清楚的。谢谢
55 sql_info->sql_data[sql_info->num_rows]->col_name=calloc(1,sizeof(*azColName)*argc);
56 sql_info->sql_data[sql_info->num_rows]->data=calloc(1,sizeof(*argv)*argc);