Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 注释行上的故障:_C_Pointers_Segmentation Fault - Fatal编程技术网

C 注释行上的故障:

C 注释行上的故障:,c,pointers,segmentation-fault,C,Pointers,Segmentation Fault,我正试图解决Codechef上的一个问题。我以前也发过这方面的帖子,但我的做法完全不同 问题的想法是确定给定测试用例是否出现了所需的情况。 理想情况是,每个顶点的间接方向都高于与其相连的顶点。也就是说,如果a->b,F(b)应该是>F(a)。如果给定的设置不可能这样做,则输出是不可能的。如果不是,则输出具有最大间接方向的顶点x的最小值F(x),以使其适用于所有其他顶点。 我还没有尝试打印可能案例的输出 输入格式: 输入的第一行包含一个数字t,即测试用例的数量 每个测试用例包含两个空间分隔的整数

我正试图解决Codechef上的一个问题。我以前也发过这方面的帖子,但我的做法完全不同

问题的想法是确定给定测试用例是否出现了所需的情况。 理想情况是,每个顶点的间接方向都高于与其相连的顶点。也就是说,如果a->b,F(b)应该是>F(a)。如果给定的设置不可能这样做,则输出是不可能的。如果不是,则输出具有最大间接方向的顶点x的最小值F(x),以使其适用于所有其他顶点。 我还没有尝试打印可能案例的输出

输入格式:

输入的第一行包含一个数字t,即测试用例的数量

每个测试用例包含两个空间分隔的整数N和M,分别表示图中的顶点数和边数

下面的每一条M线都包含两个空间分隔的整数a b,表示从顶点a到顶点b的边

两个顶点a和b之间可以有多条边。 例如

输出应为:

不可能

二,

#包括
#包括
#包括
类型定义结构节点{
int-val;
结构节点*下一步;
};
int间接寻址[10001]//间接[a]起作用。它所拥有的顶点计数由列表[a].val给出;
int main()
{
int测试用例,num_顶点,num_边,a,b,c,d,e;
scanf(“%d”和测试用例);
而(测试用例--)
{
scanf(“%d%d”、&num_顶点、&num_边);
结构节点*列表[num_顶点];//指向节点的指针数组
int-h;
结构节点*ptr;
对于(h=1;hval=0;
}
memset(间接寻址,010001);
对于(e=0;enext->val=b;
printf(“SS\n”);
间接[a]=1;
ptr=列表[a]->下一步;
printf(“SSS\n”);
printf(“案例1\n”);
}
其他的
{printf(“输入案例2\n”);
间接[c]++;
//如果我把上一个注释掉的话,这里会出现错误
ptr->next->val=b;
printf(“案例2\n”);
ptr=ptr->next;
}
a++;
}
int tra,i;
结构节点*ptr1,*ptrnext;
对于(i=1;不精确;
{
if(间接[ptr1->val]val])
{printf(“不可能”);
打破
}
其他的
{   
ptr1=ptrnext;
ptrnext=ptrnext->next;
}
}
}
免费(名单);
}
}
我在评论中提到segfault的两条语句就在(我认为)有问题的语句之前。如果我删除第一条语句,则在第二条语句中删除segfault。如果我同时删除这两条语句,则无论如何都会删除segfault


仍在尝试解决此问题,以便我可以继续下一个问题。谢谢!

您的代码段出错,因为您创建了一个
struct Node*
数组并为它们分配内存,但您从未设置每个
节点的
next
指针。因此每个
节点的
next
指针都指向somewhere random在内存中,当您尝试访问它时会出现故障


我认为您的设计是错误的。如果您试图创建节点的链接列表(如下一个指针所示),您根本不需要创建一个数组来保存节点。

您的代码段出错,因为您创建了一个
struct Node*
数组并为它们分配内存,但您从未设置每个
节点的
next
指针。因此每个
节点的
next
指针只是随机指向内存中的某个地方当您尝试访问它时,nd SEG会出现故障

我认为您的设计是错误的。如果您试图创建节点的链接列表(如下一个指针所示),您根本不需要创建一个数组来保存节点。

在代码中

list[a]->next->val=b;
list[a]->下一步
可能是
NULL
。在我看来,最好在取消引用之前进行
NULL
检查

中的
ptr->next
也是如此

ptr->next->val=b;
然而,在使用它之前,您需要将内存分配给下一个

未知内存位置

另外,为什么不从中的
0
开始循环呢

for(h=1;h<=num_vertices;h++)
用于代码中的(h=1;h)

list[a]->next->val=b;
list[a]->下一步
可能是
NULL
。在我看来,最好在取消引用之前进行
NULL
检查

中的
ptr->next
也是如此

ptr->next->val=b;
然而,在使用它之前,您需要将内存分配给下一个

未知内存位置

另外,为什么不从中的
0
开始循环呢

for(h=1;h<=num_vertices;h++)

for(h=1;h
num\u顶点
视为基于1而不是基于0

    struct Node *list[num_vertices];//array of pointers to node
    int h;
    struct Node * ptr;

    // for(h=1;h<=num_vertices;h++)
    for(h=0;h<num_vertices;h++)

       {
        list[h]=(struct Node *)malloc(sizeof(struct Node));
        list[h]->val=0;
       }

建议更简单的
malloc()
style

        list[h] = malloc(sizeof *(list[h]));

num_顶点
视为基于1而不是基于0

    struct Node *list[num_vertices];//array of pointers to node
    int h;
    struct Node * ptr;

    // for(h=1;h<=num_vertices;h++)
    for(h=0;h<num_vertices;h++)

       {
        list[h]=(struct Node *)malloc(sizeof(struct Node));
        list[h]->val=0;
       }

建议更简单的
malloc()
style

        list[h] = malloc(sizeof *(list[h]));

我分析了您的所有代码,发现其中有几个问题,这些问题主要表明您不理解指针

  • 数组是基于索引的
    0

    /* if you declare, struct list[size];
     * index goes from 0 ti szie - 1
     */
    for (h = 1 ; h <= num_vertices ; h++)
    {
    
  • 您的
    memset
    错误,
    sizeof(int)!=1

    /* memset(indirection, 0, 10001); wrong */
    memset(indirection, 0, 10001 * sizeof(int));
    
  • 访问
    间接
    数组时不检查溢出

    /* this is very unsafe, you don't check c */
    printf("Message recd %d \n", indirection[c]);
    
  • 取消引用
    节点->下一步
    ,而不检查
    NULL

    /* don't dereference list[a]->next without checking . 
     * list[a]->next->val (wrong) 
     */
    next = list[a]->next;
    if (next != NULL)
        next->val = b;
    
  • 您可以
    free
    列表
    ,它是一个数组而不是指针,因此您不能在它上面调用
    free
    ,但是,您应该
    free
    它的元素,因为它们是指向有效
    malloc
    ed内存的指针

    for (i = 0 ; i < num_vertices ; i++)
        free(list[i]);
    
    for(i=0;i