簡體   English   中英

從調用到破壞malloced結構的Seg Fault

[英]Seg Fault from call to destroy malloced struct

因此,當我調用以下函數時,我得到一個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
    }
}

writeOutVariables ,您將遞增variableVector->variables以遍歷列表。 但是,這是因為它是一個指針,你正在遞增實際值,因此將指針移到末尾之外。 然后,當你嘗試釋放變量時,你實際上正在釋放以前沒有被malloced的內存。

相反,在writeOutVariables初始化一個指向variableVector->variables的指針,這樣你就不會破壞那個指針。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM