【问题标题】:Segmentation Fault C in use of linked list链表使用中的分段错误 C
【发布时间】:2014-04-24 15:33:27
【问题描述】:

我写了一个返回分段错误错误的代码。代码很长,但我将其基本部分编写如下。请注意,主函数内定义的函数的所有变量都已定义,我测试了代码广告,它没有进入 Function_1。这就是我认为问题出在声明之类的原因

    typedef struct node_type
{
    int data;
    struct node_type *next;
} node;

typedef node *list;

void Function_1(list R, int *Matrix, int Length, int A);
int main()
{
    int S = 5;
    int A = 1;
    int Mat1[5];
    //int *Mat = malloc(S*sizeof(int));
    int *Mat = &Mat1[0];
    printf("Enter the Matrix with length of 10:\n");
    for (int i = 0; i < S; i++)
    {
        scanf("%i", &(*(Mat+i)));
    }

    list head;
    head = (list)malloc(sizeof(node));
    head->next = NULL;
    for (int i = 0; i < S; i++)
        {
            printf("%d\t", *(Mat+i));
        }
    //printf("\nEnter the Array = \n");
    //scanf("\n%d", &A);
    printf("\nA = %i", A);
    Function_1(head, Mat, S, A);

    while (head != NULL)
    {
        printf("%d\t", head->data);
        head = head->next;
    }

        return 0;
    }


void Function_1(list R, int *Matrix, int Length, int A)
{
    printf("11111");
    list tail;
    tail = R;
    int Counter = 0;
    int i = 0;
    while (tail != NULL)
    {
        if (*(Matrix+i) == A)
        {
        Counter++;
        tail->next = (list)malloc(sizeof(node));
        tail->next->data = i;
        tail->next->next = NULL;
        tail = tail->next;
        }
    i++;
    }
R->data = Counter;
printf("%d", Counter);
}

谢谢

【问题讨论】:

  • 我很难从您提供的代码中找到段错误。也许您可以发布一个小(完整)程序来演示段错误?
  • 那么,为什么要将矩阵作为指针发送?您是否尝试更新 Function_1 中存储单元中的数据?如果是这样,那你为什么不直接做 Function_1(head, &Mat1, S, A);?您是否还在函数中正确引用了 Mat 的数据?您还需要通过引用发送链接列表的头部。您还应该通过引用传递头部。
  • 正如我所说,直到调用 Function_1 之前,它都被完美编译。我认为问题在于该函数参数的一种声明。我检查了所有这些,但我不知道问题出在哪里。
  • 你能把整个代码上传到某个地方吗?您也可以在您的问题中添加一份副本。我有几个猜测,但我不想从我的猜测中给出答案。可能其他人也不想这样做。
  • 在您调用 Function_1 之前,让我们查看所有代码。

标签: c linked-list segmentation-fault declaration


【解决方案1】:

使用您提供的代码,我可以说由于缺少&lt;stdlib.h&gt;&lt;malloc.h&gt; 包含而发生分段错误或访问冲突,导致假设malloc,然后head 到被指派的不是你所期望的。

我不知道,这也可能是由于您的代码中的随机点...

编辑:

根据您的最新编辑,在函数Function_1 内的循环中,您正尝试访问内存位置Matrix + i 的内容,而i 没有边界。 i 等于 04 可以访问那里,但在那之后就不行了,没有什么可以阻止它变得更大。

考虑将您的while 条件更改为i &lt; 5 或类似的东西。我不知道你的目标是什么 while ( R != NULL )R 在整个循环中永远不会改变,所以这个条件不会在一次为真后变为假,或者相反。

编辑 2:

while 条件相当tail != NULL 时类似,只有当malloc 分配内存失败时才会评估为0i 很可能会超过 4,然后才会用完这么多内存,以至于 malloc 开始失败。

【讨论】:

  • 当然我把所有需要的库都放了,正如你所见,我取消了 malloc 函数。我把 printf("1") 放在 Function_1 的开头,但它没有被遵守,这意味着问题在 Function_1 之前
  • @user42037 你有多确定?看,在这里,如果您同时包含了 &lt;stdio.h&gt;&lt;stdlib.h&gt;,那么在调用 Function_1 之前,您的代码都可以正常工作:ideone.com/F7SFDI 您的代码中还有其他问题,不是您的代码向我们展示。
  • 我更新了帖子并为 Function_1 提供了一个示例。你可以编译它。你会看到 printf("11111");不会被编译
  • @user42037 现在,我已经更新了我的答案。将条件更改为i &lt; 5 后,代码应该可以正常工作,您可能会在以下位置看到:ideone.com/pItgk5 未来的错误可能会阻止您的控制台/终端显示它们应该已经显示的东西,不会发生在我的Windows 8.1,但如果它真的如你所说的那样发生,我不会感到惊讶。
  • 对不起,这只是一个愚蠢的错误,它是tail而不是R。如果您运行代码,我会理解它不会在Function_1的开头编译printf(“1111”)。我更新它。
猜你喜欢
  • 2013-10-21
  • 2012-06-12
  • 2020-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多