c - 我的 codewars 解决方案在 Visual Studio 中本地运行良好,但在通过 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 中测试此解决方案时,我收到以下提示:
他们似乎使用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}}");
}
这项任务让我有点困惑,只是因为函数应该返回一个指向结构数组的指针的指针……对我来说,这似乎是一个过多的指针。那么,测试代码有问题吗?我有点难以完全理解它......还是我的解决方案实际上实施不当?如果是这样,我可以更改什么以不导致内存错误?
解决方案
您不需要指向此处的指针的指针。您正在返回局部变量的地址而不是分配的指针。
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;
}
推荐阅读
- python - 为什么我收到 sqlalchemy.exc.IntegrityError
- kotlin - 我是 Volley Networking 库的新手,遇到这个问题 java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Try again
- c - 我应该总是将 char[] last value 设置为 '\0' 吗?
- authentication - 我们如何使用 LDAP 从 Active Directory 获取用户信息
- resize - 在剑道网格中未调用调整大小功能
- c# - 使用多个身份用户时,Identity.UserManager 类型没有服务
- javascript - 不变违规:元素类型无效:预期为字符串(对于内置组件)或类/函数(对于复合组件)但得到:未定义
- ios - UICollectionView scrollToItem 打破约束并且不会滚动
- amazon-web-services - BatchGetItem 获取 DynamoDB 的关键变量列表
- c# - XmlDocument.NodeInserted 在 XmlDocument.Validate() 上触发