首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >指针没有指向正确的对象

指针没有指向正确的对象
EN

Stack Overflow用户
提问于 2020-03-28 18:45:39
回答 2查看 100关注 0票数 0

我试图用一个函数作为参数(在这种情况下,它是无效的,因为目标是使它与任何数字类型“兼容”)、它的大小以及它想要计算的函数。一切看起来都很好,因为它编译时没有错误,但是它返回(打印)了奇怪的值。

果然,在对每个函数进行切分之后,指针指向了内存中的一些奇怪的数字,而不是我传递给countSelect函数的数组(然后是次要函数)。

在这个层次上,我对指针和C都是新手,我会非常感激一个更有经验的人告诉我到底出了什么问题(以及改进/避免它的建议)。

代码语言:javascript
运行
复制
#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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-28 18:54:58

代码语言:javascript
运行
复制
if (select(a+i)) total++;

将这一行改为:

代码语言:javascript
运行
复制
if (select(a+i * sizelem)) total++;

通常,当向指针添加值时,编译器会自动将数字乘以元素的大小,因此一切都正常工作,但是由于它是一个空指针,编译器不知道元素的大小。因此,您必须乘以sizelem才能自己完成它。

票数 -1
EN

Stack Overflow用户

发布于 2020-03-28 19:19:31

实际上,编译器警告您注意这个问题(-Wpointer-arith),因为您正在尝试void* + 2,所以它是一个奇怪的指针算术操作(实际上它是未定义的行为,在隐藏部分下,它正在添加sizeof(void),检查如下:Pointer Arithmetic)。因此,您必须对空指针进行强制转换,以指示其大小:

if (select((int *)a+i)) total++;

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60905375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档