我现在有这个代码:
pacient sortClients(int n, pacient *lista, int print)
{
pacient aux[50];
for(i=0;i<n;i++)
*(aux+i)=*(lista+i);
//some modifications performed on aux
return *aux;
}
void sortAndShowByAge(int n, pacient *lista)
{
pacient aux[50];
*aux=sortClients(n,lista,0);
}
最后一个功能是我遇到麻烦的地方。如果aux只有一个记录,那么它可以正常工作,如果有两个以上,它会显示一些奇怪的字符。在第一个函数中,我迭代了lista并将每个记录保存到aux。有没有办法将sortClients中的aux直接分配给shortAndShowByAge中的aux而不是迭代?我无法迭代sortClients。
答案 0 :(得分:2)
您的代码只返回一个元素,而不是整个数组。它不能合法地返回写入的数组,因为它是一个局部变量。
您需要动态分配新内存,或者就地排序。
前者,就像你已经拥有的那样,会是这样的:
pacient * sortClients(int n, const pacient *lista, int print)
{
pacient *aux;
if((aux = malloc(n * sizeof *aux)) != NULL)
{
memcpy(aux, lista, n * sizeof *aux);
/*some modifications performed on aux */
}
return aux;
}
这将返回一个指向已排序/已处理数组的指针,您必须在完成后调用free()
,以免泄漏内存。
我alao更正了返回类型,并使用memcpy()
而不是手动循环来复制输入值。输入数组也标记为const
,因为它对函数是只读的。
答案 1 :(得分:1)
问题在于:
pacient sortClients(int n, pacient *lista, int print)
返回 pacient
的一个实例。它不返回数组:
return *aux; /* <---- synonymous with return aux[0]; */
在sortAndShowByAge()
中,以下内容采用已返回的单个元素并将其复制到aux[0]
中:
*aux=sortClients(n,lista,0); /* <---- synonymous with aux[0]=... */
我认为解决此问题的最佳方法是简单地sortClients()
修改提供的数组,而不必返回任何内容。这将解决错误,并将摆脱大部分不必要的复制。
答案 2 :(得分:0)
将指针作为参数传递给aux
而不是函数。此外,您可以使用memcpy而不是循环(除非您在循环中进行这些修改):
void sortClients(int n, pacient *lista, pacient *aux, int print)
{
memcpy(aux, lista, n * sizeof(pacient));
//some modifications performed on aux
}
void sortAndShowByAge(int n, pacient *lista)
{
pacient aux[50];
sortClients(n,lista,aux,0);
}
当然,您可以使用已有的for循环。关键是在调用者中创建了aux,并将指针传递给它。
答案 3 :(得分:0)
您的sort函数不会返回有效内容,因为aux是在函数中本地声明的。
相反,您可以在其中声明一个包含数组的结构,并返回该结构以获取副本
typedef struct ret
{
pacient aux[50];
} ret_t;
...
ret_t sortClients( int n, pacient *lista, int print ) {...}
或者在函数中使用malloc分配数组并返回该内存块的地址
pacient* sortClients(...)
pacient *aux = malloc(50 * sizeof( pacient ) );
...
return aux;