Разница между передачей адреса переменной напрямую и передачей указателя (на ту же переменную) в C? - PullRequest
0 голосов
/ 31 января 2020

Я хотел бы знать, почему при вызове функции 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;

}

Редактировать: Добавлено минимальный воспроизводимый код

1 Ответ

1 голос
/ 31 января 2020

Ваш код страдает от ошибок, которые приводят к Неопределенное поведение .

scanf("%d", &usr_option);

printf("Val:        %d\n", *(uint32_t *)data_32);

printf("Val:        %d\n", *(uint64_t *)data_64);

void main()

должно быть

#include <inttypes.h>

scanf("%" SCNu8, &usr_option);

printf("Val:        %" PRIu32 "\n", *(uint32_t *)data_32);

printf("Val:        %" PRIu64 "\n", *(uint64_t *)data_64);

int main(void)

ВСЕГДА включайте и учитывайте предупреждения вашего компилятора. (Я использую -Wall -Wextra -pendatic для gcc.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...