在将结构添加到结构数组中时,我会遇到麻烦。我在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;
}
但是当我跑步时,它会崩溃。怎么了?
对不起,错误在此行发生:
memcpy(&realms[i], &rd, sizeof(struct realm_data));
max_realm定义为50,但是在我的表中,我只有25行,因此 i 达到25(当我评论错误行时)。TMP_SQL是char [1000]。我在mySQL查询上没有任何错误,如果我打印结果,我会得到所有错误。
我在发布的代码中看到的唯一错误是,如果sql_row[1]
具有NAME_LENGTH
或更多字符,则strncpy
不能保证rd.name
的null终止。将其更改为NAME_LENGTH-1
并添加rd.name[NAME_LENGTH-1] = ' '
。(实际上,您将结构对所有0字节的 memset
got to to to thate to that thate。)