好的,我所指的代码如下所示.它不是整个代码,但它是相关的部分

void
array_sort(void *A, int arr_size, int comparison(void *, void*)) {
    void *max = A;
    int i;
    for (i = 0; i < arr_size; i++) {
        if (comparison(A + i, max) == -1) {
            max = A + i;
        }
    }
}


int
num_ascending(void *n1, void *n2) {
    double v1 = *((double *) n1), v2 = *((double *) n2);
    if (v1 > v2) {
        return -1;
    } else if (v1 < v2) {
        return 1;
    }
    return 0;
 }

函数的意图并不重要,我已经删除了不相关的部分,但问题区域在上面.我的问题是,用户使用Double数组调用arraySort,并使用num_ascending作为比较函数.问题是,当调用if语句并将地址A+i和max传递给比较函数时,如果i大于0,则A+i位置的值始终更改为0,而不管原始数组A[]有多大.

问题是,我使用了一系列的打印语句来跟踪呼叫.在比较调用之前,A+1处的值是1.00,在num_ascending()调用中,它立即读作0.00.我验证了我们正在传递的空指针没有更改,因为在地址中确实可以完美地传递,但该地址的值刚刚变为0.它没有为空虚*最大.我只是完全不确定为什么会发生这样的事情.如有任何帮助,将不胜感激!

推荐答案

您遇到的问题似乎源于如何访问ARRAY_SORT函数中双精度数组中的元素.让我们仔细看看您的ARRAY_SORT函数:

void array_sort(void *A, int arr_size, int comparison(void *, void*)) {
    void *max = A;
    int i;
    for (i = 0; i < arr_size; i++) {
        if (comparison(A + i, max) == -1) {
            max = A + i;
        }
    }
}

当你把i加到空格上*比较一下指针(A+i,max),你实质上是把指针向前移动了i倍它所指向的数据类型的大小.这可能不是您想要做的.

如果A指向双精度数组,则将A递增I会将指针向前移动I*sizeof(双)字节,这不是访问数组中的元素所需的大小.

相反,您应该使用数组索引来访问数组中的元素.下面是更正ARRAY_SORT函数的方法:

void array_sort(void *A, int arr_size, int comparison(void *, void*)) {
    void *max = A;
    int i;
    for (i = 0; i < arr_size; i++) {
        if (comparison((char *)A + i * sizeof(double), max) == -1) {
            max = (char *)A + i * sizeof(double);
        }
    }
}

在这个更正的版本中,我们使用i来索引数组,方法是将i与sizeof(双精度)相乘.这确保了我们可以正确地访问Double数组中的每个元素.强制转换为(char*)是正确执行指针算术所必需的,因为在C中不允许递增空格*.

C++相关问答推荐

数组元素的编号索引

rSP堆栈指针在返回函数调用的值时有任何用途吗?

C如何显示字符串数组中的第一个字母

如何正确地索引C中的 struct 指针数组?

Ruby C Api处理异常

为什么我不能只在内存地址中添加一个int来寻址任何数组?

进程已完成,退出代码为138 Clion

使用错误的命令执行程序

C:在编译时构建和使用字符串文字的预处理器宏?

无法访问共享目标文件内的共享指针

CS50判断灯泡运动的问题,判断时多出一个灯泡,但不在终端上

C标准关于外部常量的说明

通过对一个大的Malloc内存进行切片来使用Malloc的内存片

如何在C中定义指向函数的指针并将该指针赋给函数?

将复合文字数组用作临时字符串缓冲区是否合理?

当我将偏移量更改为任何非零值时,C中的mmap共享内存出现无效参数错误

挥发性语义的形式化理解

UpDown控制与预期相反

C中2个数字的加法 - 简单的人类方法

子进程不会修改父进程中的统计信息