C 注释行上的故障:
我正试图解决Codechef上的一个问题。我以前也发过这方面的帖子,但我的做法完全不同 问题的想法是确定给定测试用例是否出现了所需的情况。 理想情况是,每个顶点的间接方向都高于与其相连的顶点。也就是说,如果a->b,F(b)应该是>F(a)。如果给定的设置不可能这样做,则输出是不可能的。如果不是,则输出具有最大间接方向的顶点x的最小值F(x),以使其适用于所有其他顶点。 我还没有尝试打印可能案例的输出 输入格式: 输入的第一行包含一个数字t,即测试用例的数量 每个测试用例包含两个空间分隔的整数N和M,分别表示图中的顶点数和边数 下面的每一条M线都包含两个空间分隔的整数a b,表示从顶点a到顶点b的边 两个顶点a和b之间可以有多条边。 例如 输出应为: 不可能 二,C 注释行上的故障:,c,pointers,segmentation-fault,C,Pointers,Segmentation Fault,我正试图解决Codechef上的一个问题。我以前也发过这方面的帖子,但我的做法完全不同 问题的想法是确定给定测试用例是否出现了所需的情况。 理想情况是,每个顶点的间接方向都高于与其相连的顶点。也就是说,如果a->b,F(b)应该是>F(a)。如果给定的设置不可能这样做,则输出是不可能的。如果不是,则输出具有最大间接方向的顶点x的最小值F(x),以使其适用于所有其他顶点。 我还没有尝试打印可能案例的输出 输入格式: 输入的第一行包含一个数字t,即测试用例的数量 每个测试用例包含两个空间分隔的整数
#包括
#包括
#包括
类型定义结构节点{
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;hnum\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