将结构的内容传递给C中的另一个变量

时间:2012-01-25 11:18:43

标签: c

我现在有这个代码:

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。

4 个答案:

答案 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;