将结构添加到结构数组中时遇到了麻烦。我在realm.h中声明了这个结构:
extern struct realm_data realms[MAX_REALM];
struct realm_data
{
int realm_id;
char name[NAME_LENGTH];
};
我尝试在realm.c中填写它:
struct realm_data realms[MAX_REALM];
int do_init_realm(void)
int i=0;
MYSQL_RES* sql_res = 0;
MYSQL_ROW sql_row = 0;
struct realm_data rd;
while(1) {
sprintf (tmp_sql, "SELECT `RealmID`, `Realm` FROM `realm_info` ORDER BY `RealmID` LIMIT %d, 1", i);
if(mysql_query(&mmysql_handle, tmp_sql)) {
log_fail("realm-loadrealms",mysql_error(&mmysql_handle));
return 0;
}
sql_res = mysql_store_result(&mmysql_handle);
if (mysql_num_rows(sql_res) > 0) {
sql_row = mysql_fetch_row(sql_res);
memset(&rd,0,sizeof(rd));
rd.realm_id = atoi(sql_row[0]);
strncpy(rd.name, sql_row[1], NAME_LENGTH);
memcpy(&realms[i], &rd, sizeof(struct realm_data));
i++;
} else
break;
mysql_free_result(sql_res);
}
return 1;
}
但是当我跑步时,它会崩溃。有什么问题?
答案 0 :(得分:0)
对不起,错误发生在这一行:
memcpy(&realms[i], &rd, sizeof(struct realm_data));
MAX_REALM被定义为50,但在我的表中我只有25行,所以 i 达到25(当我评论错误行时)。 tmp_sql是char [1000]。我没有得到任何关于mysql查询的错误,如果我打印结果,我得到它们。
答案 1 :(得分:0)
我在发布的代码中看到的唯一错误是,如果strncpy
有rd.name
个或更多字符,则sql_row[1]
不保证NAME_LENGTH
的空终止。将其更改为NAME_LENGTH-1
并添加rd.name[NAME_LENGTH-1] = '\0'
。 (实际上,你的memset
结构到所有0字节应该处理最后一部分。)