【问题标题】:Linked list segmentation fault in CC中的链表分段错误
【发布时间】:2012-06-12 01:29:29
【问题描述】:

我对链表有疑问。我有两个结构:

struct ekstra
{
    char isim[256];
    int deger;
    struct ekstra *sonra;
};

struct node
{
    char name[256];
    int val;
    struct ekstra *next;    
};

我有这些:

struct ekstra *tmp;
struct node dizi[12];

在我的代码中某处

tmp = dizi[k].next;
tmp=tmp->sonra;

如果我这样做:

tmp = malloc(sizeof(struct ekstra));

没有问题。

但如果我这样做:

dizi[k].next->sonra = malloc(sizeof(struct ekstra));

我得到一个 SegFault。为什么会这样?

【问题讨论】:

  • 您最好在调试器的帮助下运行代码。在 linux 上,valgrind 非常适合指出分段错误。此外,在 Windows 上,Visual Studio 调试器非常有用。
  • 可能你误用了数组索引k。请发布完整代码
  • @GeorgeGaál 请不要要求完整的代码,而是可以重现问题的更完整的代码。
  • @Drise 就是说“能够重现问题的最少完整代码量”。我同意 George 的观点,您需要确保 k 在数组的范围内,并确保 next 不为空? GNU 调试器也可用于解决此问题。
  • k 是 0 这里 k 没有问题

标签: c pointers linked-list segmentation-fault


【解决方案1】:

这一行:

dizi[k].next->sonra = malloc(sizeof(struct ekstra));

正在取消引用

dizi[k].next

我怀疑它有垃圾值。

【讨论】:

    【解决方案2】:

    这两行:

    tmp = dizi[k].next;
    tmp = tmp->sonra;
    

    可能将无效指针复制到tmp。当您使用malloc() 分配给tmp 时,来自malloc() 的有效指针将覆盖tmp 中已有的无效值。

    使用时:

    dizi[k].next->sonra = malloc(sizeof(struct ekstra));
    

    您正在引用无效指针(以评估存储 sonra 成员的地址),这导致了分段错误。

    如果你写了:

    *tmp = 0;
    

    您也可能会遇到分段错误。

    【讨论】:

      猜你喜欢
      • 2013-10-21
      • 2020-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      • 1970-01-01
      • 2020-06-19
      相关资源
      最近更新 更多