我有一个结构SInfoEntry来存储我从VCF file读取的数据。
struct SInfoEntry
{
int type; //Info Type
std::string key; //Info Tag
void* values = NULL; //Data
int n; //Len
};
在下面的代码中,我尝试将数据存储在我的struct中的 values 变量中。但是,当我尝试这样做时,我收到了错误:
SInfoEntry infoEntry;
//This line is giving me EXC_BAD_ACCESS exception
bcf_get_info_values(m_pHeader, m_pRecord, "AF", (void**)(&infoEntry.values), &infoEntry.n, BCF_HT_REAL);
但是,如果我声明一个本地数组,该函数会成功返回我想要的数据:
void* values = NULL;
int nvalue;
bcf_get_info_values(m_pHeader, m_pRecord, "AF", (void**)(&values), &nvalue, BCF_HT_REAL);
为什么尝试将数据读入struct失败?我在指针算术中遗漏了什么吗?
我正在使用外部库中的 'bcf_get_info_values' 函数,这是该函数的签名:
int bcf_get_info_values(const bcf_hdr_t *hdr, bcf1_t *line, const char *tag, void **dst, int *ndst, int type);
修改: Here是 bcf_get_info_values 功能来源的链接。我可以看到,我不需要分配内存,因为函数使用的是realloc()。
答案 0 :(得分:0)
您实际在做的是将数据复制到未分配的内存空间。
在第一个示例中,它可能已初始化为NULL,因此应用程序崩溃了。 第二个例子就是将数据复制到随机存储器位置,这不起作用,非常危险。
您可以执行以下操作之一:
声明一个数组,其大小为您要放入其中的最大对象大小:
uint8_t values[1000];
int nvalue;
bcf_get_info_values(m_pHeader, m_pRecord, "AF", (void**)(&values), &nvalue, BCF_HT_REAL);
或动态分配数组:
void* values = malloc(size);
int nvalue;
bcf_get_info_values(m_pHeader, m_pRecord, "AF", (void**)(&values), &nvalue, BCF_HT_REAL);