【发布时间】:2021-07-21 22:10:41
【问题描述】:
我必须将接收 int 数组的函数转换为可以接收任何类型数组的泛型函数,将值与常数进行比较并返回值与该 const 不同的数组。为此,我使用了 void 指针,但在获取正确的输出时遇到了一些问题,并且数组的 realloc 也存在一些问题。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ALG 0
int f2(int * e) {
return *e == ALG;
}
int * f1(int a[], size_t *size, int (*fin)(int * e)) {
size_t i = *size;
while(i--) {
if(fin(&a[i])) {
memmove(&a[i], &a[i+1], (--*size -i)*sizeof(int));
}
}
return realloc(a, *size * sizeof (int));
}
//generic type function
int * f1a(void *a, size_t *size, int (*fin)(int * e)) {
size_t i = *size;
while(i--) {
int * x = (int*) a + i;
if(fin(x)) {
memmove(a + i, a + i + 1, (--*size -i)*sizeof(*a));
}
}
return realloc(a, *size * sizeof (*a));
}
int main(void) {
int *a = malloc(8*sizeof(int));
a[0] = 2; a[1] = -3; a[2] = 1; a[3] = 0; a[4] = 4; a[5] = 7; a[6] = 0; a[7] = 6;
size_t i, size=8;
printf("%zu\n", size);
//int *res = f1(a, &size, f2); output : 2 -3 1 4 7 6
int *res = f1a(a, &size, f2);
for(i=0; i<size; i++) {
printf("%d ", res[i]);
}
return 0;
}
谁能帮帮我?
提前致谢!
【问题讨论】:
-
对于
void*版本,您必须传递一个元素的大小。 -
您能详细说明一下吗?我没明白。谢谢
-
void*没有关于它指向什么的信息,但该函数需要它,因此您必须单独传递它。 -
qsort()的界面或许能给你一些启示。 -
memmove(&a[i], &a[i+1], (--*size -i)*sizeof(int));结果为AddressSanitizer: heap-buffer-overflow。首先你的代码有问题。