我在链接列表上做错了一些事情,但出现了细分错误

问题描述

这是给我造成皮肤衰老的功能

exporter.c

static void ExportExterns(char *name){

boolean makeExtern = false;
externalAdressesPointer *pointer;
pointer = getExternalAdressesHead();
FILE *file;
char *fullName = malloc(sizeof(char)*(strlen(name)+5));
strcpy(fullName,name);
    

fullName = strcat(fullName,".ext");
if (pointer =! NULL){
    file = fopen(fullName,"ab+");
    fprintf(file,"%s %07d\n",pointer->symbol,pointer->adress); /**<<HERE IS THE SEGMENTATION FAULT*/
    while (pointer->nextAdress != NULL){
        pointer = pointer->nextAdress;
        fprintf(file,pointer->adress);
    }

    fprintf(stdout,"Externs file %s exported\n",fullName);
}

细分错误来自我评论的行(fprintf(file,pointer->adress);

这是所有文件都使用的头文件

external.h

    typedef struct externalAdresses
{
    char *symbol;
    int adress;
    struct externalAdresses *nextAdress;

}externalAdressesPointer;




externalAdressesPointer *getExternalAdressesHead();
void storeAdressWithExternalSymbol(char *,int);

这是我创建链接列表的地方:

external.c ,这是整个文件

#include "general.h"
#include "external.h"
#include "parameters.h"



externalAdressesPointer *AdressesWithExternalSymbolsHead = NULL;

/**gets a symbol and dress of a word that is containing the symbol stores them in the AdressesWithExternalSymbols list  */
void storeAdressWithExternalSymbol(char *_symbol,int _adress){
    char *Symbolcopy = malloc(MAX_LINE_LENGTH+2);
    externalAdressesPointer *ListPointer = NULL;
    strcpy(Symbolcopy,_symbol);
    if (AdressesWithExternalSymbolsHead == NULL){ /**create the head of the list if it doesn't exist*/
    
    AdressesWithExternalSymbolsHead = (externalAdressesPointer *)malloc(sizeof(externalAdressesPointer));
    ListPointer = AdressesWithExternalSymbolsHead;
    
    }

    else{/**if a list exist (head exists)*/
        
        ListPointer = AdressesWithExternalSymbolsHead;
        
        while (ListPointer->nextAdress != NULL){/**gets the last link of the list*/
            ListPointer = ListPointer->nextAdress; 
        }

        ListPointer->nextAdress = (externalAdressesPointer *)malloc(sizeof(externalAdressesPointer));/**add a new adress to the list*/
        ListPointer = ListPointer->nextAdress;
    }

    ListPointer->symbol = Symbolcopy;
    ListPointer->adress = _adress;
    ListPointer->nextAdress = NULL;


}

/**returns a pointer to the head of the external adresses list*/
externalAdressesPointer *getExternalAdressesHead(){
    return AdressesWithExternalSymbolsHead;
}

我还有2个链表,但它们并没有发生,我无法弄清这里有什么区别,而导致fprintf出现此分段错误的我的错误是什么

解决方法

您在函数pointer =! NULL的{​​{1}}语句中做了if

这是ExportExterns! NULL的分配。

pointer被评估为! NULL,因为1被认为是错误的,而NULL是逻辑而非运算符。

这将使指针变量!的指针无效,而对其取消引用将导致分段错误。

您应该使用pointer作为条件。

另外,在使用pointer != NULL之前,还应检查file是否不是NULL(如果fopen()成功)。