在特定位置的数组中插入struct

时间:2014-02-01 15:09:05

标签: c

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

但是当我跑步时,它会崩溃。有什么问题?

2 个答案:

答案 0 :(得分:0)

对不起,错误发生在这一行:

memcpy(&realms[i], &rd, sizeof(struct realm_data));

MAX_REALM被定义为50,但在我的表中我只有25行,所以 i 达到25(当我评论错误行时)。 tmp_sql是char [1000]。我没有得到任何关于mysql查询的错误,如果我打印结果,我得到它们。

答案 1 :(得分:0)

我在发布的代码中看到的唯一错误是,如果strncpyrd.name个或更多字符,则sql_row[1]不保证NAME_LENGTH的空终止。将其更改为NAME_LENGTH-1并添加rd.name[NAME_LENGTH-1] = '\0'。 (实际上,你的memset结构到所有0字节应该处理最后一部分。)