【问题标题】:How do I make copies of an array using a void function?如何使用 void 函数制作数组的副本?
【发布时间】:2021-04-04 23:25:18
【问题描述】:

这是一个简单的密码破解游戏的一部分。在这篇文章中,该程序旨在比较隐藏列表和猜测以找到“不完美的匹配”,例如具有正确编号但位置错误的匹配。例如,如果隐藏列表是:

12321

我的猜测是:

13222

应该说我得到了 2 个完美匹配和 2 个不完美匹配。我真的很挣扎如何让我的嵌套循环“忽略”已经发现的不完美匹配或完美匹配(因为它们是在不同的函数中计算的)。我知道我需要创建数组的副本,但我不知道如何使用提供的函数来做到这一点。请帮忙,我真的迷路了。

int ImperfectMatches(int hidelist[], int guess[], int length) {
    int i, j;
    int imperfectsum;
    for(i = 0; i < length; i++){
        for(j = 0; j < length; j++){
            if(hidelist[i] == guess[j]){

                }
            }
        }
return imperfectsum;
}

void copyArray(int dest[], int source[], int length) {

return;
}

【问题讨论】:

    标签: c function void


    【解决方案1】:

    如果您可以假设 dest 分配有足够的内存来保存 sourcelength 整数,那么您需要做的就是调用 memcpy

    memcpy(dest, source, sizeof(*dest) * length);
    

    如果destsource 可以重叠,则不能使用memcpy。相反,如果你想要一个标准函数,你可以使用memmove(这意味着代码应该在编译器遵循标准的所有平台上编译)。

    memmove(dest, source, sizeof(*dest) * length);
    

    如果dest 未分配,那么您必须修改函数以返回目标地址或修改函数的参数以传递目标数组的地址(即,将 dest 定义为 @987654333 @) 然后使用malloc*dest 赋值。

    int * copyArray(int source[], int length) {
        int * dest = malloc(sizeof(*dest) * length);
        if (dest == NULL)
            return NULL;
        memcpy(dest, source, sizeof(*dest) * length); // no overlap possible
        return dest;
    }
    

    而且,正如 Eric(和其他人多次指出的那样),如果您使用 sizeof(*dest) 而不是 sizeof(int),那么在 copyArray 的事件中,您不必修改 sizeof 表达式原型更改。

    【讨论】:

    • bcopy 不是 C 标准。使用memmove。同样length * sizeof *destsizeof(int) * length 更可取,因为它会在参数类型发生变化时自动适应。
    • 很好地解释了memcpy()的限制和memmove()的使用。
    猜你喜欢
    • 2017-05-30
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 2012-01-02
    • 2015-06-26
    • 2012-11-08
    • 1970-01-01
    • 2014-01-17
    相关资源
    最近更新 更多