0

最近我一直在通过编写不同的数据结构来提高我的编程技能,这就是一个开始!!!

现在我正在编写链表,但是有些烦人的事情发生了,这个问题困扰了我很长时间,因为我不太确定这个错误,Segmentation fault(core dumped),但我确实知道我做错了什么内存的操作。

链接列表.h:

struct LINK_LIST {
  char *string;
  struct LINK_LIST *next;
}link_list;

===============================

链接列表.c:

#include<stdio.h>
#include<stdlib.h>

int init_link_list(struct LINK_LIST *new_link) {
  //char *new_string;
  int i;
  //new_string = (char *)malloc(sizeof(char) * STRING_SIZE);
  new_link = (struct LINK_LIST *)malloc(sizeof(struct LINK_LIST));
  if (new_link==NULL) {
fprintf(stderr, "Insufficient memory!!!");
return ERROR;
  }
  //new_link->string = new_string;
  new_link->string = NULL;
  //new_link->next = NULL;

  return OK;
}

这里我定义了初始化操作,然后是插入操作:

int insert(struct LINK_LIST *link, int pos, char *in) {
  int i;
  if (get_length(link)>=STRING_SIZE) {
    fprintf(stderr, "Link list is full!!!");
    return ERROR;
  }
  else {
    if (pos < 0 || pos-1 > get_length(link)) {
      fprintf(stderr, "Invalid position");
      return ERROR;
    }
    else {
      i = 0;
      do {
          struct LINK_LIST *new_node;
          init_link_list(new_node);
          new_node->next = link->next;
          link->next = new_node;
          new_node->string = in;
          i += 1;
        } while(i<pos-1);
     }
 }
 return OK;
}
4

1 回答 1

2

你有一个错误:

struct LINK_LIST *new_node;
init_link_list(new_node);

init_link_list中,参数的值被修改:

new_link = (struct LINK_LIST *)malloc(sizeof(struct LINK_LIST));

但是这种修改只是函数的局部;一旦你回到你的调用函数,那个改变就会丢失:

struct LINK_LIST *new_node;
init_link_list(new_node);
// Oops ! new_node's new value is lost !

您有内存泄漏(malloc的结果丢失)并且new_node未初始化。当您尝试访问*new_node时,您会访问内存中的随机位置,因此会进行核心转储。

有一些可能的更正,最简单的方法是丢弃您的 OK/ERROR 返回值,如果 malloc 成功则返回非空指针,如果失败则返回 NULL:

struct LINK_LIST *init_link_list(void) {
  struct LINK_LIST *new_link = malloc(sizeof(struct LINK_LIST));

  if (new_link==NULL) {
    fprintf(stderr, "Insufficient memory!!!");
    return NULL;
  }

  new_link->next = NULL;
  return new_link;
}

然后,插入代码变为:

...
else {
  i = 0;
  do {
      struct LINK_LIST *new_node = init_link_list();
      // Note : here, should check whether new_node is NULL and deal with the situation
      new_node->next = link->next;
      link->next = new_node;
...
于 2013-11-04T14:28:51.983 回答