我正在尝试为作业创建代码,但不断收到无法弄清楚的内存错误

  • 本文关键字:弄清楚 错误 内存 作业 代码 创建 c
  • 更新时间 :
  • 英文 :


提示为:

Riverfield乡村走读学校今晚将举办舞会之夜。今晚的舞会将有M个男孩和N个女孩。每个男孩都想和一个比他矮得多的女孩跳舞。一个女孩只能和一个男孩跳舞,反之亦然。考虑到所有男孩和女孩的身高,可以判断是否所有男孩都有可能和女孩跳舞。

输入:第一行包含T,表示测试用例的数量。每个测试用例包含三行。第一行包含M和N。第二行包含M个整数,每个整数表示男孩的身高。第三个包含N个整数,每个整数表示女孩的身高。

输出:如果每个男孩都可以和另一个女孩跳舞,则打印YES。打印NO。

样本输入:

1

4 5

2 5 6 8

3 8 5 1 7

样本输入的输出:

YES

我的代码计划是用女孩和男孩的高度填充两个数组,然后用每个男孩搜索每个女孩。如果男孩的身高大于那个位置的女孩,我想删除那个索引处的女孩,并将女孩身高数组移回一并调整大小。我更改了代码以修复一些语法错误,但现在我得到了一个不同的错误,它无法输出。问题是我得到了这个错误:

已退出,返回代码为-11(SIGSEGV(。

这是我的代码:

//Jacob Hathaway September 11, 2022 Sorting
#include <stdio.h>
#include <stdlib.h>
void remove_girl(int**, int, int, int);
int main() {
int j, h, i, g, testCases, numBoys, numGirls, *boyHeights, *girlHeights;

scanf("%d", &testCases);
for (g = 0; g < testCases; g++) { // For each test case
scanf("%d", &numBoys);
scanf("%d", &numGirls);
boyHeights = (int*)malloc(sizeof(int)*numBoys); //Allocating Memory
girlHeights = (int*)malloc(sizeof(int)*numGirls); //Allocating Memory
for(j = 0; j < numBoys; j++){ // Filling Array
scanf("%d", &h);
*(boyHeights+j) = h;
}
for(j = 0; j < numGirls; j++){ // Filling Array
scanf("%d", &h);
*(girlHeights+j) = h;
}
for(j = 0; j < numBoys; j++){ // For each boy
for(i = 0; i < numGirls; i++){ // Go through each girl
if (girlHeights[i] < boyHeights[j]) { //If the height of the girl at position i is less than boy at position j
remove_girl(&girlHeights, i, numGirls, sizeof(girlHeights)); // Call to function that removes the girl at i and shifts
//numGirls -= 1;
}
}
}
if (((int(sizeof(girlHeights)) - int(sizeof(boyHeights))) <= (numGirls - numBoys))) {
printf("YESn");
}
else {
printf("NOn");
}
}
free(boyHeights);
free(girlHeights);
return 0;

}

void remove_girl(int **girlHeights, int index, int numGirls, int size) { //removes girl at index and shifts array back
long unsigned int p;
for(p = index; p < sizeof(girlHeights) - 1; p++) girlHeights[p] = girlHeights[p+1];
*girlHeights = (int*)malloc(sizeof(int)*(numGirls-1));

}

remove_girl():中

  1. 如果要更改girlHeights,请将指针传递给它。

  2. 消除int size参数,因为您没有使用它。

  3. 你的循环是错误的。sizeof(pointer)是存储指针的字节数,可能为8,与指针指向的数据无关

  4. (次要,不固定(更喜欢使用无符号类型作为索引和大小(例如size_t(。您希望更新所有变量以避免混合,并防止其中任何一个变为负数(例如,如果在双循环中出现numGirls == 0,会发生什么?(。

  5. 您需要使用realloc()而不是malloc()来调整数组的大小。当您使用malloc()时,您会创建一个新的内存块,丢失以前存储的数据,并泄漏旧内存。

void remove_girl(int **girlHeights, int index, int numGirls) {
for(int i = index; i < numGirls - 1; i++)
(*girlHeights)[i] =  (*girlHeights)[i + 1];
void *tmp = realloc(*girlHeights, (numGirls - 1) * sizeof(**girlHeights));
if(!tmp) {
printf("realloc failedn");
exit(1);
}
*girlHeights = tmp;
}

并将呼叫更新为:

remove_girl(&girlHeights, i, numGirls);

这解决了您的segfault:

$ ./a.out
1
4 5
2 5 6 8
3 8 5 1 7
YES

相关内容

  • 没有找到相关文章

最新更新