我有以下代码:(请原谅这段代码的长度)。我试图访问矢量中的矢量元素。 table_info * get_table_info函数获取特定表的table_info向量的值。当我尝试检查column_info向量的值时,我遇到了一个奇怪的错误,程序突然终止。
typedef struct _column_info {
char name[20]; // columns name
int type; // 0:INT, 1: CHAR
int size;
int offset; // start position
} column_info;
typedef struct _table_info {
char name[20];
int column_count;
char columns[100];
vector <column_info> col; //col[0], col[1]...
char primary_key[5];
int recordsize;
int totalsize;
int records;
} table_info;
vector <table_info> v;
void create_table(char* tablename, struct columns *cc , int num_col, char* pkey) {
char* new_columns;
new_columns = (char*)malloc(256*sizeof(char));
strcpy(new_columns,"");
int len = 0;
len = num_col;
for ( int i=0 ; i < len ; i++ )
{
strcat(new_columns, cc[i].c_name);
strcat(new_columns, ":");
strcat(new_columns, cc[i].c_type);
if ( strcmp(cc[i].c_type,"char") == 0 )
{
strcat(new_columns, "(");
strcat(new_columns, cc[i].c_size);
strcat(new_columns, ")");
record_size = record_size + atoi(cc[i].c_size);
}
else
record_size = record_size + 4;
if( i != (len-1) )
strcat(new_columns, ",");
}
table_info new_table;
strcpy(new_table.name, tablename);
strcpy(new_table.columns, new_columns);
strcpy(new_table.primary_key, pkey);
new_table.recordsize = record_size;
new_table.totalsize = 0;
new_table.records = 0;
v.push_back(new_table);
column_info cols;
int offset = 0;
for(int x=0;x<num_col;x++)
{
strcpy(cols.name, cc[x].c_name);
if ( strcmp(cc[x].c_type,"char") == 0 )
cols.type = 1;
else
cols.type = 0;
cols.size = atoi(cc[x].c_size);
cols.offset = offset;
offset += cols.size;
new_table.col.push_back(cols);
}
table_info* table_info;
table_info = get_table_info(tablename);
int offset2=0;
int size2 = 0;
for (int i = 0; i < num_col ; i++)
{
offset2 = table_info->col.at(i).offset; // ERROR: ABNORMAL PROGRAM TERMINATION
printf("offset:%d\n",offset2);
size2 = table_info->col.at(i).size;
}
}
table_info* get_table_info(const string& tablename)
{
printf("table info \n");
for (int i = 0; i < (int) v.size(); i++)
{
if (strcmp(v.at(i).name, tablename.c_str()) == 0)
return &v.at(i);
}
return NULL;
}
知道为什么这个程序会终止?请帮忙。
答案 0 :(得分:1)
你有:
table_info* table_info
table_info = get_table_info(tablename);
...
for (int i = 0; i < num_col ; i++)
{
offset2 = table_info->col.at(i).offset;
...
}
但是get_table_info()可以返回NULL,因此您可能正在取消引用NULL指针(使用 - &gt;)。你也需要处理这个案子!
另一种可能性是col.at(i)部分,你确定我介于0和col.size() - 1之间吗?请注意,这完全取决于参数num_col!
答案 1 :(得分:0)
没有所有代码很难说,但看起来你实际上并没有将数据分配给struct中的“cols”成员:
for(int x=0;x<num_col;x++)
有可能你在'for'语句之后分配num_col并且从不实际分配值。但是,我不知道你在这里粘贴的片段。您需要提供实际的源文件内容。
您还应该在代码中添加更多错误检查。具体来说,您遇到问题的区域是:
offset2 = table_info->col.at(i).offset;
在尝试访问col.at(i)之前检查向量的大小。如果某些内容关闭,请向stdout添加一些printf / cout语句。否则,请使用已知的记录器:
http://boost-log.sourceforge.net/libs/log/doc/html/log/tutorial/sources.html
这有助于更快地解决代码中的问题。
要检查的另一件事是如何链接和引用代码。这些结构与c ++在同一个源中吗?您是否链接外部c库并引用这些标头?您可能必须检查并补偿字节对齐,填充您引用的结构。
答案 2 :(得分:0)
问题是这段代码:
v.push_back(new_table);
在列添加到表之前调用。此时“col” - 集合为空。然后push_back
将table_info
实例的副本推送到向量(当然使用空col
- 向量)。因此,如果添加列,则不会将其添加到向量中的实例,而是添加到本地实例。并且由于num_col
大于零,如果您尝试访问该行上的列,则会抛出异常,因为table_info
是存储在向量中的实例(具有空{{1}的实例}}):
col
解决方案是在调用offset2 = table_info->col.at(i).offset; // ERROR: ABNORMAL PROGRAM TERMINATION
之前(或者在添加列之后,如果您愿意的话)向下移动push_back
代码:
get_table_info