Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在c+中的向量中使用向量时访问元素时出现异常程序终止错误+;_C++ - Fatal编程技术网

C++ 在c+中的向量中使用向量时访问元素时出现异常程序终止错误+;

C++ 在c+中的向量中使用向量时访问元素时出现异常程序终止错误+;,c++,C++,我有以下代码:(请原谅这个代码的长度)。我试图访问向量中向量的元素。 table_info*get_table_info函数获取特定表的table_info向量的值。当我试图检查列_infovector的值时,我遇到了一个奇怪的错误,程序突然终止 typedef struct _column_info { char name[20]; // columns name int type; // 0:INT, 1: CHAR int size; int offset; // start posit

我有以下代码:(请原谅这个代码的长度)。我试图访问向量中向量的元素。 table_info*get_table_info函数获取特定表的table_info向量的值。当我试图检查列_infovector的值时,我遇到了一个奇怪的错误,程序突然终止

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;
  }
typedef结构\u列\u信息{
字符名称[20];//列名称
int-type;//0:int,1:CHAR
整数大小;
int offset;//起始位置
}栏目信息;
类型定义结构表信息{
字符名[20];
int列_计数;
字符列[100];
向量列;//列[0],列[1]。。。
字符主键[5];
int记录大小;
整数总大小;
int记录;
}表1-1信息;
向量v;
void create_table(char*tablename,struct columns*cc,int num_col,char*pkey){
char*新的_列;
新的_列=(char*)malloc(256*sizeof(char));
strcpy(新的_列,“”);
int len=0;
len=num_col;
对于(int i=0;i列在(i).大小;
}
}
表格信息*获取表格信息(常量字符串和表格名称)
{
printf(“表信息”);
对于(int i=0;i<(int)v.size();i++)
{
if(strcmp(v.at(i).name,tablename.c_str())==0)
返回和v.at(i);
}
返回NULL;
}
知道此程序终止的原因吗?请提供帮助。

您有:

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;
    ...
}
表格信息*表格信息
table_info=获取_table_info(tablename);
...
对于(int i=0;i列在(i)处。偏移量;
...
}
但是get_table_info()可以返回NULL,因此您可能正在取消对NULL指针的引用(使用->)。您也需要处理这种情况

另一种可能是col.at(i)部分,您确定i介于0和col.size()之间吗?请注意,这完全取决于参数num_col!

您有:

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;
    ...
}
表格信息*表格信息
table_info=获取_table_info(tablename);
...
对于(int i=0;i列在(i)处。偏移量;
...
}
但是get_table_info()可以返回NULL,因此您可能正在取消对NULL指针的引用(使用->)。您也需要处理这种情况


另一种可能是col.at(i)部分,您确定i介于0和col.size()之间吗?请注意,这完全取决于参数num_col!

如果没有所有代码,很难判断,但看起来您实际上从未将数据分配给struct中的“cols”成员:

for(int x=0;x<num_col;x++)
在尝试访问col.at(i)之前,请检查向量的大小。如果某些内容已关闭,请向stdout添加一些printf/cout语句。否则,请使用已知的记录器:

这将有助于更快地解决代码中的问题


另一个要检查的代码是如何链接和引用的。这些结构是否与C++的源代码相同?是否链接到外部C库并引用这些头?您可能需要检查和补偿字节对齐,填充所引用的结构。

不知道所有代码都很难说,但看起来很像。e您实际上从未将数据分配给struct中的“cols”成员:

for(int x=0;x<num_col;x++)
在尝试访问col.at(i)之前,请检查向量的大小。如果某些内容已关闭,请向stdout添加一些printf/cout语句。否则,请使用已知的记录器:

这将有助于更快地解决代码中的问题


另一个要检查的是代码是如何链接和引用的。这些结构是否与C++相同的源代码?你是否链接到外部C库并引用这些头文件?你可能需要检查和补偿字节对齐,填充你所引用的结构。< / P > < P >问题是:这个代码:

v.push_back(new_table);
在列添加到表中之前调用。此时“col”-集合为空。然后
push_back
table_info
实例的副本推送到向量(当然是空的
col
-vector)。因此,如果添加列,则不会将其添加到向量中的实例,而是添加到本地实例。由于
num\u col
大于零,因此如果尝试访问该行的列,则会引发异常,因为
table\u info
是存储在向量中的实例(具有空
col
):

解决方案是在调用
get\u table\u info
之前(或者在添加列之后,如果愿意的话),将
推回
代码向下移动:


问题在于此代码:

v.push_back(new_table);
在列添加到表中之前调用。此时“col”-集合为空。然后
push_back
table_info
实例的副本推送到向量(当然是空的
col
-vector)。因此,如果添加列,则不会将其添加到向量中的实例,而是添加到本地实例。由于
num\u col
大于零,因此如果您尝试访问该行的列,则会引发异常,因为
table\u info
是存储的实例