I would like to know why when calling the function uint_x64_read doesnt work when called using the statement (*func_list_x32_x64[2]) (ptr_64); (Im not getting any warnings nor errors my program just exits) but runs correctly when using (*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;
}
Edit: Added minimal reproducible code
 
    