使用子结构分配正确大小的struct变量

时间:2016-01-09 16:02:45

标签: c++ struct casting size

所以我试图为变量分配正确的大小。然后将另一个变量复制到这个新变量,然后访问新变量的数据。

的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;。这对我来说看起来是正确的,但它不起作用。

1 个答案:

答案 0 :(得分:0)

正确的表达应该更像这样:

size = val->count * (sizeof(Validations) + sizeof(Query) + (sizeof(Query::Column) * q->columnCount));

但请注意,如果每个查询可能有所不同,您可能需要将列计数加起来。