【问题标题】:Passing array of structures to function by value in C在C中按值传递结构数组以发挥作用
【发布时间】:2015-10-18 03:43:09
【问题描述】:

我想将三个结构的数组传递给一个函数,该函数对存储在结构数组中的三个数字进行排序,但不想更改实际值,因为数组是通过引用传递的,这就是我的问题,任何想法都接受谢谢:)

这是我的审查代码:

#include <stdio.h>
#define N 3
typedef struct
{
    int digito;
} numbers;

void  sort(numbers tabla[], int nro);
void enternums(numbers  tabla[], int nro);

int main()
{
    static numbers enter[N];
    int i, j, tmp;
    enternums(enter, N);
    printf("Data before entering the function...\n\n");
    for (i = 0 ; i < N ; i++)
    {
        printf("%d\n", enter[i].digito);
    }
    sort(enter, N);

    printf("After entering data function....\n\n");
    for (i = 0 ; i < N ; i++)
    {
        printf("%d\n", enter[i].digito);
    }
    return 0;
}

void enternums(numbers tabla[], int nro)
{
    int i;
    for (i = 0 ; i < nro ; i++)
    {
        printf("Enter a digit for the position %d:  ", i);
        scanf("%d", &tabla[i].digito);
    }
}

void sort(numbers tabla[N], int nro)
{
    int i, j, tmp;
    for (i = 1 ; i < nro ; i++)
    {
        j = i;
        tmp = tabla[i].digito;
        while ((j > 0) && (tmp < tabla[j - 1].digito))
        {
            tabla[j].digito = tabla[j - 1].digito;
            j--;
        }
        tabla[j].digito = tmp;
    }
}

【问题讨论】:

  • 你不需要把代码写得这么难读,你可以像我一样做。当然数组不是通过引用传递的。
  • 我不太明白你真正想要什么,scanf("%d", &amp;tabla[i].digito); 是你代码中的一个潜在错误,因为你不检查返回值,即scanf() 的成功或失败。
  • 您可以复制传递的数组并对副本进行排序
  • @bpgeck 如果你返回数组,这将是有意义的,否则它只是一个故意的内存泄漏!
  • @iharob 他不必做深拷贝。他可以将其存储在堆栈中。

标签: c arrays function structure


【解决方案1】:

将数组作为指针1 传递给它的第一个元素,这样做的好处是您实际上可以传递另一个数组来存储新值

void sort(const numbers *const tabla, numbers *resultado, int nro)
{
    int i, j, tmp;
    for (i = 1 ; i < nro ; i++)
        resultado[i].digito = tabla[i].digito;
    for (i = 1 ; i < nro ; i++)
    {
        tmp = resultado[i].digito;
        for (j = i ; (j > 0) && (tmp < resultado[j - 1].digito) ; --j)
            resultado[j].digito = resultado[j - 1].digito;
        resultado[j].digito = tmp;
    }
}

while 循环改为for 循环,这将使您的代码更清晰。

并使用它

int main()
{
    static numbers enter[N];
    static numbers ordenado[N];
    int i, j, tmp;
    enternums(enter, N);
    printf("Data before entering the function...\n\n");
    for (i = 0 ; i < N ; i++)
    {
        printf("%d\n", enter[i].digito);
    }
    sort(enter, ordenado, N);

    printf("After entering data function....\n\n");
    for (i = 0 ; i < N ; i++)
    {
        printf("%d\n", ordenado[i].digito);
    }
    return 0;
}

此外,通过检查可能的错误来使您的代码更安全,例如

scanf("%d", &tabla[i].digito);

应该是

if (scanf("%d", &tabla[i].digito) != 1)
    Oops_there_is_a_problem_dont_use_this_value_maybe_ask_again();

1这是自动发生的,它不是通过引用传递,而是转换为指针

【讨论】:

    【解决方案2】:

    您不能按值传递数组,除非它们包含在 struct 中。

    你可以使用:

    typedef struct MyStrutArray
    {
       numbers  enter[N];
    } MyStructArray;
    

    然后使用:

    void  sort(MyStructArray array);
    

    【讨论】:

      猜你喜欢
      • 2013-02-28
      • 2014-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-21
      • 2011-02-14
      • 2020-09-21
      • 2020-05-23
      相关资源
      最近更新 更多