无法打印结构
Can't print struct
我正在尝试打印名为 Task 的结构的成员,但它只打印第一个成员,然后它给我一个分段错误。有人可以帮帮我吗?
这是我的代码:
void listartarefas(Task *ff)
{
int i;
for(i=0;i<=1;i++)
{
if(ff[i].tipo == 1)
{
printf("Agendada:\n");
printf("%d\n",ff[i].identf);
printf("%s\n",(ff[i].path));
printf("%d-%d-%d\n",(ff[i].ano),(ff[i].mes),(ff[i].dia));
printf("%d:%d:%d\n",(ff[i].hora),(ff[i].minuto),(ff[i].segundo));
}
else
{
printf("Executada:\n");
printf("%d\n",ff[i].identf);
printf("%s\n",(ff[i].path));
printf("%d-%d-%d\n",(ff[i].ano),(ff[i].mes),(ff[i].dia));
printf("%d:%d:%d\n",(ff[i].hora),(ff[i].minuto),(ff[i].segundo));
}
}
}
int main()
{
Task tf={2,1,"home/fsm/mieti/projB/Makefile",17,20,00,1,5,22};
Task tt={3,0,"home/fsm/mieti/projB/Makefile",17,22,34,1,4,44};
Task *ff[]={&tf,&tt};
listartarefas(*ff);
return 0;
}
因为您没有将指向数组的指针传递给 listartarefas
函数。相反,你取消引用数组,它只给你第一个元素,它是一个指向 单个 结构的指针,你像两个一样循环,导致 [undefined行为}(http://en.wikipedia.org/wiki/Undefined_behavior).
你的代码中有一些奇怪的东西,比如你有一个指针数组,而不是简单的结构数组,这意味着你要么必须改变你的函数来接受一个指针数组,要么改变从指针数组到结构数组的数组。
我的建议是使用结构数组,并按原样传递它,因为数组自然会退化为指针。例如
Task ff[] = {
{2,1,"home/fsm/mieti/projB/Makefile",17,20,00,1,5,22},
{3,0,"home/fsm/mieti/projB/Makefile",17,22,34,1,4,44}
};
listartarefas(ff);
listartarefas(*ff);
所以这个调用等同于
listartarefas(ff[0]);
现在您传递的是数组 ff
的第一个元素,它是指向结构的指针。
在您尝试访问 ff[1]
的函数中,您看到了崩溃。
你可以按照建议@Joachim做一些事情
问题就在这里
listartarefas(*ff);
您正在传递 *ff[] 的间接寻址,这是您打算传递的数组的第一个元素。您可能想这样做:
void listartarefas(Task **ff)
{
int i;
for(i=0;i<=1;i++)
{
if(ff[i]->tipo == 1)
{
printf("Agendada:\n");
printf("%d\n",ff[i]->identf);
printf("%s\n",(ff[i]->path));
printf("%d-%d-%d\n",(ff[i]->ano),(ff[i]->mes),(ff[i]->dia));
printf("%d:%d:%d\n",(ff[i]->hora),(ff[i]->minuto),(ff[i]->segundo));
}
else
{
printf("Executada:\n");
printf("%d\n",ff[i]->identf);
printf("%s\n",(ff[i]->path));
printf("%d-%d-%d\n",(ff[i]->ano),(ff[i]->mes),(ff[i]->dia));
printf("%d:%d:%d\n",(ff[i]->hora),(ff[i]->minuto),(ff[i]->segundo));
}
}
}
int main()
{
Task tf={2,1,"home/fsm/mieti/projB/Makefile",17,20,00,1,5,22};
Task tt={3,0,"home/fsm/mieti/projB/Makefile",17,22,34,1,4,44};
Task *ff[]={&tf,&tt};
listartarefas(ff);
return 0;
}
我正在尝试打印名为 Task 的结构的成员,但它只打印第一个成员,然后它给我一个分段错误。有人可以帮帮我吗?
这是我的代码:
void listartarefas(Task *ff)
{
int i;
for(i=0;i<=1;i++)
{
if(ff[i].tipo == 1)
{
printf("Agendada:\n");
printf("%d\n",ff[i].identf);
printf("%s\n",(ff[i].path));
printf("%d-%d-%d\n",(ff[i].ano),(ff[i].mes),(ff[i].dia));
printf("%d:%d:%d\n",(ff[i].hora),(ff[i].minuto),(ff[i].segundo));
}
else
{
printf("Executada:\n");
printf("%d\n",ff[i].identf);
printf("%s\n",(ff[i].path));
printf("%d-%d-%d\n",(ff[i].ano),(ff[i].mes),(ff[i].dia));
printf("%d:%d:%d\n",(ff[i].hora),(ff[i].minuto),(ff[i].segundo));
}
}
}
int main()
{
Task tf={2,1,"home/fsm/mieti/projB/Makefile",17,20,00,1,5,22};
Task tt={3,0,"home/fsm/mieti/projB/Makefile",17,22,34,1,4,44};
Task *ff[]={&tf,&tt};
listartarefas(*ff);
return 0;
}
因为您没有将指向数组的指针传递给 listartarefas
函数。相反,你取消引用数组,它只给你第一个元素,它是一个指向 单个 结构的指针,你像两个一样循环,导致 [undefined行为}(http://en.wikipedia.org/wiki/Undefined_behavior).
你的代码中有一些奇怪的东西,比如你有一个指针数组,而不是简单的结构数组,这意味着你要么必须改变你的函数来接受一个指针数组,要么改变从指针数组到结构数组的数组。
我的建议是使用结构数组,并按原样传递它,因为数组自然会退化为指针。例如
Task ff[] = {
{2,1,"home/fsm/mieti/projB/Makefile",17,20,00,1,5,22},
{3,0,"home/fsm/mieti/projB/Makefile",17,22,34,1,4,44}
};
listartarefas(ff);
listartarefas(*ff);
所以这个调用等同于
listartarefas(ff[0]);
现在您传递的是数组 ff
的第一个元素,它是指向结构的指针。
在您尝试访问 ff[1]
的函数中,您看到了崩溃。
你可以按照建议@Joachim做一些事情
问题就在这里
listartarefas(*ff);
您正在传递 *ff[] 的间接寻址,这是您打算传递的数组的第一个元素。您可能想这样做:
void listartarefas(Task **ff)
{
int i;
for(i=0;i<=1;i++)
{
if(ff[i]->tipo == 1)
{
printf("Agendada:\n");
printf("%d\n",ff[i]->identf);
printf("%s\n",(ff[i]->path));
printf("%d-%d-%d\n",(ff[i]->ano),(ff[i]->mes),(ff[i]->dia));
printf("%d:%d:%d\n",(ff[i]->hora),(ff[i]->minuto),(ff[i]->segundo));
}
else
{
printf("Executada:\n");
printf("%d\n",ff[i]->identf);
printf("%s\n",(ff[i]->path));
printf("%d-%d-%d\n",(ff[i]->ano),(ff[i]->mes),(ff[i]->dia));
printf("%d:%d:%d\n",(ff[i]->hora),(ff[i]->minuto),(ff[i]->segundo));
}
}
}
int main()
{
Task tf={2,1,"home/fsm/mieti/projB/Makefile",17,20,00,1,5,22};
Task tt={3,0,"home/fsm/mieti/projB/Makefile",17,22,34,1,4,44};
Task *ff[]={&tf,&tt};
listartarefas(ff);
return 0;
}