我打算了解 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/