从调用到破坏malloced结构的Seg Fault

时间:2013-11-27 00:56:38

标签: c initialization segmentation-fault malloc destructor

因此,当我调用以下函数时,我得到一个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()方法时,有人可以解释我是如何得到一个段错的吗?

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

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, " ,\t\n");
            while (currentNumber != NULL ) {
                // you have not yet reached the end of the numberArray
                int integer = atoi(currentNumber);
                writeToFileIntegerAs32bits(integer, outputFilePointer);
                currentNumber = strtok(NULL, " ,\t\n");
            }
            i++;
        } else {
            i++;
        }

        variableVector->variables++; // move on to next variable
    }
}

1 个答案:

答案 0 :(得分:2)

writeOutVariables中,您正在递增variableVector->variables以遍历列表。但是,这是因为它是一个指针,你正在递增实际值,因此将指针移到末尾之外。然后,当你尝试释放变量时,你实际上是在释放以前没有被malloced的内存。

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

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