c - 为什么使用函数指针会导致我的以下程序崩溃?

标签 c function-pointers

我打算了解 C 语言中函数指针 的工作原理。我为一个函数编写了这个程序,该函数具有一个函数指针 disp_function,预计会打印数组的内容任何类型的,使用指向预期目的地的指针 ptr,但它不起作用:

void show_array(void* ptr, void (*disp_function)(void*), int nr_elem) {
    int i=0;
    while(i<nr_elem) {
        (*disp_function) (ptr);
        ptr++;
        i++;
    }
}

下面是程序的使用实例:

void show_movements(Movement* movs, int nr) {
    void (*display_function) (void* ptr) = show_movement;
    show_array(movs, display_function, nr);
}

void show_movement(void* ptr) {
    Movement* ptr2 = NULL;
    ptr2 = (Movement*) ptr;
    printf("%d -> '%s'\n", ptr2->id, ptr2->title);
}

程序在最后一个函数中崩溃了。具体情况如下:

  • 数组有几个元素(> 2)
  • 第一个打印正确
  • 尝试打印第二个元素时程序崩溃 (通过调试验证)

我想是 ptr++ 导致了崩溃,因为我正在递增 void*。我还尝试使用数组语法 (*display_function) (ptr [i]); 但我总是得到一个错误 invalid use of void expression

谁能告诉我问题的确切原因是什么?

最佳答案

当递增 void* 指针时,C 必须猜测您的数据大小。它总是假定数据与 char 大小相同,也称为最小可分配单元 (MAU)。您还应该传入数据大小并执行以下操作:

void show_array(void* ptr, void (*disp_function)(void*), int nr_elem, size_t data_size) {
    int i=0;
    while(i<nr_elem) {
        (*disp_function) (ptr);
        ptr += data_size;
        i++;
    }
}

你的数据大小应该按如下方式传入:

void show_movements(Movement* movs, int nr) {
    void (*display_function) (void* ptr) = show_movement;
    show_array(movs, display_function, nr, sizeof(Movement) );
}

关于c - 为什么使用函数指针会导致我的以下程序崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16492453/

相关文章:

c++ - 有没有办法在没有 reinterpret_cast 的情况下保存多种类型的函数指针?

c++ - 我意识到这是错误的,但我无法删除它

python - 更改 Pickled 对象的功能

c - 内存泄漏同步读取中断通过libUSB传输数据

c++ - 在资源有限的不同进程之间建立共享内存?

c - 使用FTP客户端发送文件到FTP服务器

c - 这两种指针类型真的不兼容吗?

c - 字符串比较的空白问题

c - C语言中char arr[] = "OX|-"如何工作

c - C 中函数指针的原子读/写?