2013-11-27 73 views
0

所以,當我調用下面的函數,我收到了賽格故障:賽格故障消滅malloced結構

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; 

,這裏是他們的初始方法:

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()方法???

下面是調用上面的函數的代碼:其中方法writeOutVariables看起來像

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

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 
    } 
} 
+2

您能否顯示調用initVariableVector和destroyVariableVector的代碼? – fpw

+1

您能否顯示將變量添加到變量向量的代碼? (我想知道你是否在那裏跺腳一些內存。)另外,你可以嘗試通過像valgrind這樣的程序運行它來檢查內存操作錯誤。 –

回答

2

writeOutVariables,你遞增variableVector->variables通過列表進行迭代。但是,這是因爲它是一個指針,你正在遞增實際值,並因此將指針移動到最後。然後,當你嘗試釋放變量時,你實際上釋放了先前未被調入的內存。

相反,初始化一個指針variableVector->variables裏面writeOutVariables所以你不要打破那個指針。

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

謝謝。但是這意味着我還需要替換「變量向量 - >變量與」臨時變量「正確的」原始代碼「部分中的所有引用? –

+0

是的,您還需要將引用切換爲'variableVector-> variables' – Michael