2012-03-13 62 views
0

我有一段代碼,檢查是否已經定義一個宏,如果它不是,那麼它分配一個新的宏的內存並添加它到當前列表中。如果它已經定義,那麼它只是改變宏體,並保持名稱相同。得到一個Seg錯誤11錯誤,並不知道爲什麼

static struct macro *macro_lookup(char *name){ 
    struct macro * temp = &macro_list; 
    while(temp->next != NULL){ 
    if(strcmp(temp->macro_name,name) == 0){ 
     return temp; 
    } 
    } 
    return NULL; 
} 

void macro_set(char *name, char *body){ 
    //Need to check to see if a macro is already set for the name if so just change the body 
    struct macro * p = macro_lookup(name); //Will return NULL if macro is not in the list. This line gives me the error of segmentation fault 11, if I comment it out the program works. 
    //Need to make a new macro and add it to the list 
    if(p == NULL){ 
    //Make a new macro 
    struct macro * new_macro = (struct macro *) Malloc(sizeof(struct macro)); //Malloc is my version of malloc, it works just fine. 
    if(new_macro == NULL){ 
     fprintf(stderr,"Error while allocating space for the new marco.\n"); 
     exit(EXIT_FAILURE); 
    } 
    new_macro->macro_name = name; 
    new_macro->macro_body = body; 
    //Create a pointer to the list and traverse it until the end and put the new macro there 
    struct macro * temp = &macro_list; 
    while(temp->next != NULL){ 
     temp = temp->next; 
    } 
    temp->next = new_macro; 
    } 
    //The macro already exists and p is pointing to it 
    else{ 
    //Just change the body of the macro 
    p->macro_body = body; 
    } 
} 

我不知道爲什麼上面的錯誤行給了我一個問題,我可以靜態集合P爲空,測試它,它工作正常,但是當我使用macro_lookup功能它得到一個賽格故障。

+2

您應該學習如何使用調試器。它將幫助您找出程序崩潰的確切線條,並讓您檢查變量以查看它們中的任何一個是否是例如'NULL'。 Linux中最常見的調試器可能是[GDB](http://www.gnu.org/software/gdb/)。 – 2012-03-13 06:22:52

回答

0

這是有可能的問題:

new_macro->macro_name = name; 
new_macro->macro_body = body; 

通常應該分配的字符串足夠的空間,然後複製它們。除非調用代碼執行內存分配並將信息釋放到macro_set()函數,否則不能簡單地將它們交給那樣。

如果您已經顯示了宏結構的定義,這將會很有幫助。我假設它大致是:

struct macro 
{ 
    char *macro_name; 
    char *macro_body; 
}; 

不是:

struct macro 
{ 
    char macro_name[MAX_MACRO_NAME_LEN]; 
    char macro_body[MAX_MACRO_BODY_LEN]; 
}; 

如果是後者,你只需要使用strcpy(),但你必須之前檢查溢出這樣做。

1

macro_lookup()您檢查temp->next不是NULL,但tempNULL?另外,如何temp->macro_nameNULL?還是未初始化?或nameNULL還是未初始化?當你遇到seg故障時,調試器顯示你什麼?此外,你不增加溫度(這是不好的,因爲你的循環永遠不會結束)。

相關問題