在特定位置插入阵列中的结构



在将结构添加到结构数组中时,我会遇到麻烦。我在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。)