C valgrind reporting“;大小为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

我正在寻找内存分配的分段错误,所以我决定用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 *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);