我试图用一个函数作为参数(在这种情况下,它是无效的,因为目标是使它与任何数字类型“兼容”)、它的大小以及它想要计算的函数。一切看起来都很好,因为它编译时没有错误,但是它返回(打印)了奇怪的值。
果然,在对每个函数进行切分之后,指针指向了内存中的一些奇怪的数字,而不是我传递给countSelect函数的数组(然后是次要函数)。
在这个层次上,我对指针和C都是新手,我会非常感激一个更有经验的人告诉我到底出了什么问题(以及改进/避免它的建议)。
#include <stdio.h>
int selNegInt(void * num) {
int * pointToNum = (int *) num;
//printf("1 - %d\n", *pointToNum);
return *pointToNum < 0; //or *((int *) num)
}
int selEvenInt(void * num) {
int * pointToNum = (int *) num;
//printf("2 - %d\n", *pointToNum);
return *pointToNum % 2 == 0;
}
int selOddIn(void * num) {
int * pointToNum = (int *) num;
//printf("3 - %d\n", *pointToNum);
return *pointToNum % 2 != 0;
}
int selGt10In(void * num) {
int * pointToNum = (int *) num;
//printf("4 - %d\n", *pointToNum);
return *pointToNum > 10;
}
int countSelected(void * a , int size, int sizelem, int (*select)(void *)) {
int total=0;
for (int i=0; i<size/sizelem; i++) {
if (select(a+i)) total++;
}
return total;
}
int main(void) {
int a[] = {-1, 24, 0, 2141, -241, 2415};
printf("Num negs = %d\n", countSelected(a, sizeof(a), sizeof(*a), selNegInt));
printf("Num evens = %d\n", countSelected(a, sizeof(a), sizeof(*a), selEvenInt));
printf("Num odds = %d\n", countSelected(a, sizeof(a), sizeof(*a), selOddIn));
printf("Num greater than 10 = %d\n", countSelected(a, sizeof(a), sizeof(*a), selGt10In));
return 0;
}发布于 2020-03-28 18:54:58
if (select(a+i)) total++;将这一行改为:
if (select(a+i * sizelem)) total++;通常,当向指针添加值时,编译器会自动将数字乘以元素的大小,因此一切都正常工作,但是由于它是一个空指针,编译器不知道元素的大小。因此,您必须乘以sizelem才能自己完成它。
发布于 2020-03-28 19:19:31
实际上,编译器警告您注意这个问题(-Wpointer-arith),因为您正在尝试void* + 2,所以它是一个奇怪的指针算术操作(实际上它是未定义的行为,在隐藏部分下,它正在添加sizeof(void),检查如下:Pointer Arithmetic)。因此,您必须对空指针进行强制转换,以指示其大小:
if (select((int *)a+i)) total++;
https://stackoverflow.com/questions/60905375
复制相似问题