首页 > 解决方案 > 我的 codewars 解决方案在 Visual Studio 中本地运行良好,但在通过 codewars 端的测试时会导致错误

问题描述

!!!包含 CODEWARS 任务的剧透!!!

给定以下任务

CodeWars 的任务

我想出了以下解决方案:

Pair** removNb(long long n, int* length)
{
    int idx = 0;
    Pair* pairs = malloc(0);

    for (long long i = 1; i <= n; i += 1)
    {
        for (long long j = 1; j <= n; j += 1)
        {
            long long product = i * j;
            long long sum = 0;
            for (long long g = 1; g <= n; g += 1)
            {
                if (g != i && g != j)
                {
                    sum += g;
                }    
            }

            if (product == sum)
            {
                pairs = realloc(pairs, (idx + 1) * sizeof(Pair));
                pairs[idx].first = i;
                pairs[idx].snd = j;
                idx += 1;
            }
        }
    }

    *length = idx;
    return &pairs;
}

并在 Visual Studio 中对其进行了本地测试,一切似乎都运行良好(即使我收到一些关于内存重新分配的警告,但我是 C 的新手,我现在正试图让事情正常工作。对此的任何建议也值得赞赏寿)

但是当我尝试在 CodeWars 中测试此解决方案时,我收到以下提示: 来自 codewards 的错误提示

他们似乎使用Criterion库来测试解决方案。这是那里的测试代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <criterion/criterion.h>

typedef struct Pair Pair;
struct Pair {
    long long first;
    long long snd;
};

Pair** removNb(long long n, int* length);
// fct  to compare results; sz number of pairs / Pair** arr will be freed
char* array2StringData(Pair** arr, int sz);

void dotest(long long n, char* sexpr) {
    int lg = 0;
    Pair** act = removNb(n, &lg);
    char* sact = array2StringData(act, lg);
    if(strcmp(sact, sexpr) != 0)
        printf("Error. Expected %s but got %s\n", sexpr, sact);
    cr_assert_str_eq(sact, sexpr, "");
    if (strcmp(sact, "{}") != 0) {
        free(sact); sact = NULL;
    }
}

Test(removNb, ShouldPassAllTheTestsProvided) {
    dotest(26, "{{15, 21}{21, 15}}");
    dotest(100 , "{}");
    dotest(37 , "{{21, 31}{31, 21}}");
    dotest(101 , "{{55, 91}{91, 55}}");
}

这项任务让我有点困惑,只是因为函数应该返回一个指向结构数组的指针的指针……对我来说,这似乎是一个过多的指针。那么,测试代码有问题吗?我有点难以完全理解它......还是我的解决方案实际上实施不当?如果是这样,我可以更改什么以不导致内存错误?

标签: cdynamic-memory-allocation

解决方案


您不需要指向此处的指针的指针。您正在返回局部变量的地址而不是分配的指针。

Pair* removNb(long long n, int* length)
{
    Pair* pairs = malloc(0);
    ....
    return pairs;
}

如果您需要指向指针,那么您还必须为其提供一些内存。

Pair** removNb(long long n, int* length)
{
    Pair** rc = malloc(sizeof(Pair**));
    Pair* pairs = malloc(0);
    ....

    *rc = pairs;
    return rc;
}

推荐阅读