Я хотел бы знать, почему при вызове функции uint_x64_read
не работает при вызове с использованием оператора (*func_list_x32_x64[2]) (ptr_64);
(я не получаю ни предупреждений, ни ошибок, из-за которого просто выходит моя программа), но работает правильно при использовании (*func_list_x32_x64[2]) (&var_64);
func_ptr.h:
typedef enum {
FUNC_PTR_SUCCESS = 0,
FUNC_PTR_FAIL
} FUNC_PTR_STATUS;
typedef FUNC_PTR_STATUS (*func_ptr)(void *);
FUNC_PTR_STATUS uint_x32_read(void *);
FUNC_PTR_STATUS uint_x32_write(void *);
FUNC_PTR_STATUS uint_x64_read(void *);
FUNC_PTR_STATUS uint_x64_write(void *);
main. c file:
#include <stdio.h>
#include <stdint.h>
#include "func_ptr.h"
static func_ptr func_list_x32_x64[] = {
(func_ptr) uint_x32_read,
(func_ptr) uint_x32_write,
(func_ptr) uint_x64_read,
(func_ptr) uint_x64_write,
NULL
};
void main() {
uint8_t usr_option = 0;
uint32_t var_32 = 0;
uint32_t *ptr_32;
uint64_t var_64 = 0;
uint64_t *ptr_64;
ptr_32 = &var_32;
ptr_64 = &var_64;
while (1) {
printf("Enter option: ");
scanf("%d", &usr_option);
if(usr_option == 0)
(*func_list_x32_x64[0]) ((void *)ptr_32);
else if(usr_option == 1)
(*func_list_x32_x64[1]) ((void *)ptr_32);
else if(usr_option == 2) {
(*func_list_x32_x64[2]) (ptr_64);
}
else if(usr_option == 3) {
(*func_list_x32_x64[3]) (ptr_64);
}
else
break;
}
}
func_ptr. c:
#include <stdio.h>
#include <stdint.h>
#include "func_ptr.h"
/**
* @def Defines #UINT_X32_ADDR_VAL as 2000
*/
#define UINT_X32_ADDR_VAL (2000u)
/**
* @def Defines #UINT_X64_ADDR_VAL as 4000
*/
#define UINT_X64_ADDR_VAL (4000u)
FUNC_PTR_STATUS uint_x32_read(void *data_32) {
*(uint32_t *) data_32 = UINT_X32_ADDR_VAL;
return FUNC_PTR_SUCCESS;
}
FUNC_PTR_STATUS uint_x64_read(void *data_64) {
*(uint64_t *) data_64 = 45;
return FUNC_PTR_SUCCESS;
}
FUNC_PTR_STATUS uint_x32_write(void *data_32) {
printf("Val: %d\n", *(uint32_t *) data_32);
return FUNC_PTR_SUCCESS;
}
FUNC_PTR_STATUS uint_x64_write(void *data_64) {
printf("Val: %d\n", *(uint64_t *)data_64);
return FUNC_PTR_SUCCESS;
}
Редактировать: Добавлено минимальный воспроизводимый код