c-从调用到销毁mallocated结构的Seg错误



所以当我调用以下函数时,我会得到一个seg错误:

void destroyVariableVector(VariableVector* variableVector) {
    if (variableVector) {
        free(variableVector->variables); // <== Seg Fault here
        free(variableVector);
    }
}

这就是我的结构:

struct _Variable {
    char *variableName;
    char *arrayOfElements;
    int type;
    int32_t address;
};
typedef struct _Variable Variable;
struct _VariableVector {
    int size; // elements full in array
    int capacity; // total available elements
    Variable *variables;
};
typedef struct _VariableVector VariableVector;

下面是它们的init方法:

Variable* initVariable(char *variableName, char *arrayOfElements,
        int32_t address, int type) {
    Variable* initialVariable = malloc(sizeof(*initialVariable));
    if (initialVariable != NULL ) {
        initialVariable->variableName = strdup(variableName);
        initialVariable->arrayOfElements = strdup(arrayOfElements);
        initialVariable->address = address;
        initialVariable->type = type;
    }
    return initialVariable; // may be NULL
}
VariableVector* initVariableVector() {
    VariableVector* initialVariableVector = malloc(sizeof(VariableVector));
    if (initialVariableVector != NULL ) {
        initialVariableVector->size = 0;
        initialVariableVector->capacity = VECTOR_INITIAL_CAPACITY;
        initialVariableVector->variables = malloc(
                sizeof(Variable) * VECTOR_INITIAL_CAPACITY);
    }
    return initialVariableVector;
}

有人能解释一下当我调用destroyVariableVector()方法时,我是如何出现seg错误的吗???

以下是调用上述函数的代码:

VariableVector* variableVector = initVariableVector();
// add some variables to variableVector
writeOutVariables(variableVector, outputFilePointer);
destroyVariableVector(variableVector);

其中方法writeOutVariables看起来像:

void writeOutVariables(VariableVector *variableVector, FILE *outputFilePointer) {
    // write out all variables within the variableVector to the output file
    int variableVectorSize = variableVector->size;
    int i = 0;
    // start from the first variable in the varaibleVector to the last variable
    while (i < variableVectorSize) {
        //  0 = label; 1 = variable ascii string; 2 = variable number array;
        int currentType = variableVector->variables->type;
        if (currentType == 1) {
            writeToFileASCIICharArrayInReverseOrder(
                    variableVector->variables->arrayOfElements,
                    outputFilePointer);
            i++;
        } else if (currentType == 2) {
            char currentNumberArray[MAXIMUM_LINE_LENGTH + 1]; // + 1 for terminating char
            strcpy(currentNumberArray,
                    variableVector->variables->arrayOfElements);
            char* currentNumber = strtok(currentNumberArray, " ,tn");
            while (currentNumber != NULL ) {
                // you have not yet reached the end of the numberArray
                int integer = atoi(currentNumber);
                writeToFileIntegerAs32bits(integer, outputFilePointer);
                currentNumber = strtok(NULL, " ,tn");
            }
            i++;
        } else {
            i++;
        }
        variableVector->variables++; // move on to next variable
    }
}

writeOutVariables中,您递增variableVector->variables以迭代您的列表。然而,这是因为它是一个指针,所以您正在增加实际值,从而将指针移动到末尾之外。然后,当您尝试释放变量时,实际上是在释放以前没有被mallocated的内存。

相反,在writeOutVariables中初始化一个指向variableVector->variables的指针,这样就不会破坏该指针。

void writeOutVariables(VariableVector *variableVector, FILE *outputFilePointer) {
    Variable *tmpVariables = variableVector->varaibles;
    // The original code
    // ...
    tmpVariables++;
}

相关内容

  • 没有找到相关文章

最新更新