获得Seg Fault 11错误,不知道为什么

时间:2012-03-13 05:35:55

标签: c pointers segmentation-fault

我有一段代码检查宏是否已定义,如果不是,则为新宏分配内存并将其添加到当前列表中。如果它已经定义,那么它只是更改宏体,并保持名称相同。

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设置为null并测试它并且它工作正常,但是当我使用macro_lookup函数时它会得到一个seg错误。

2 个答案:

答案 0 :(得分:1)

macro_lookup()中,您检查temp->next不是NULL,而tempNULL的内容是什么?另外,temp->macro_name NULL怎么办?还是未初始化?或nameNULL还是未初始化?当您遇到seg故障时,调试器会向您显示什么?另外,你没有增加temp(这很糟糕,因为你的循环永远不会结束)。

答案 1 :(得分: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(),但在这之前你必须检查溢出。