【问题标题】:segmentation fault (core dumped) when adding this feature添加此功能时出现分段错误(核心转储)
【发布时间】:2021-04-14 10:54:15
【问题描述】:

我尝试将一个函数添加到一个已经有效的代码中。添加我的函数后,代码仍然执行,但是当我选择案例 3 时,我得到了错误分段错误(核心转储) 如果我选择案例 3,我会收到分段错误(核心转储)错误

这是我对案例 3 的功能:

typedef struct Note_
{
    int data;
    struct Note_ *next;
} Note;

Note *head= NULL;
int number= 0;


void deleteNote(int x){
    
 Note *t = head;
 Note *prev;

 if(t == NULL){
 printf("List already empty.\n");
 }
 while(t != NULL && t->data == x){
 head = t->next;
 free(t);
 t= head;
 printf("Note %d deleted.\n", x);
 }
 
 while(t != NULL){
 while(t != NULL && t->data != x){
 prev = t;
 t = t->next;
 }
 prev->next = t->next;
 free(t);
 t = prev->next;
 }
 
 }

【问题讨论】:

  • 请一次回答一个问题。如果出现语法错误,则不会出现分段错误。那么真正的问题是什么?
  • 不,我现在只得到分段错误。忘记第一个问题
  • 那么请编辑问题以仅包含相关信息,包括minimal reproducible example
  • 好的,我已经这样做了
  • 缺少元素(函数调用的上下文,Note 结构...)

标签: c linked-list singly-linked-list null-pointer function-definition


【解决方案1】:

在这段代码中sn-p

        prev->next = t->next;
        free(t);
        t = prev->next;

指针t在前面的while循环之后可以等于NULL

    while(t != NULL && t->data != x)
    {
        prev = t;
        t = t->next;
    }

所以使用空指针来访问内存,就像在这个语句中一样

         prev->next = t->next;

调用未定义的行为。

需要检查while循环后指针t是否不等于NULL

【讨论】:

  • 好的,但我现在不知道我应该在我的代码中更改或写入什么
  • 谁能帮忙
  • @adersat 短语“您需要检查 while 循环后指针 t 是否不等于 NULL”有什么不清楚的地方。在我的回答中?插入if语句难吗?
  • 但我必须在两个while循环之间添加if语句或
  • @adersat 在内循环后检查指针t是否等于NULL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-17
  • 2014-09-30
相关资源
最近更新 更多