所以我试图为变量分配正确的大小。然后将另一个变量复制到这个新变量,然后访问新变量的数据。
的Structs:
struct Validations {
int validationId;
int count; // total queries
char queries[];
};
struct Query {
struct Column {
enum Op : int { Equal, NotEqual };
int column;
int value;
Op op;
};
int relationId;
int columnCount; // total columns
Column columns[];
};
代码:
// function that creates the new val
void function1(Validations* val){
int size = sizeof(Validations) + val->count;
Validations *new_val = (Validations*)malloc(size);
memcpy(new_val, val, size);
// I store this val in a global list
}
void function2(){
// I pop the val here
// I am casting here in order to get the values that i want
const char* reader = popped_val->queries;
for (...){
// casting again
const Query* q = (Query*)reader;
// operations....
// SIGSEGV here after reader is incremented and q is casted again
// done with operations, go to next
reader += sizeof(Query)+(sizeof(Query::Column)*q->columnCount);
}
}
问题是我在第一个函数中分配的new_val大小可能不正确,因为在尝试访问数据后第二次转换function2后我遇到了分段错误。
我尝试了什么:
1)size = 1000;
试过这个测试并且它起作用所以问题肯定是大小。
2)size = sizeof(Validations) + val->count * sizeof(Query) * sizeof(Query::Column) * q->columnCount;
。这对我来说看起来是正确的,但它不起作用。
答案 0 :(得分:0)
正确的表达应该更像这样:
size = val->count * (sizeof(Validations) + sizeof(Query) + (sizeof(Query::Column) * q->columnCount));
但请注意,如果每个查询可能有所不同,您可能需要将列计数加起来。