L oop над массивом uint8_t с использованием указателя и длины массива дает странный результат - PullRequest
1 голос
/ 03 мая 2020

Я пытаюсь l oop над массивом uint8_t внутри функции. Я передаю указатель на массив и количество элементов в массиве. Если я сейчас попытаюсь напечатать число, это даст мне странный результат, если я сравню его с циклом по массиву int.

#include <iostream>

void loop_uint8_t(uint8_t *array, uint8_t array_size)
{
    for (uint8_t *p = array; p != array + array_size; ++p)
    {
        std::cout << "number (cast int)  " << (int)*p << std::endl;
        std::cout << "number (no cast)   " << *p << std::endl;
        printf("number (printf)    %d\n", *p);
    }
}

void loop_int(int *array, int array_size)
{
    for (int *p = array; p != array + array_size; ++p)
    {
        std::cout << "number (no cast)   " << *p << std::endl;
        printf("number (printf)    %d\n", *p);
    }
}

int main()
{
    // loop over uint8_t array
    std::cout << "Loop over uint8_t array:" << std::endl;
    uint8_t a[3] = {10, 20, 30};
    loop_uint8_t(a, 3);

    // loop over int array
    std::cout << "Loop over int array:" << std::endl;
    int b[3] = {10, 20, 30};
    loop_int(b, 3);

    return 0;
}

Вывод:

Loop over uint8_t array:
number (cast int)  10
number (no cast)

number (printf)    10
number (cast int)  20
number (no cast)   
number (printf)    20
number (cast int)  30
number (no cast)
number (printf)    30
Loop over int array:
number (no cast)   10
number (printf)    10
number (no cast)   20
number (printf)    20
number (no cast)   30
number (printf)    30

Поэтому мне нужно привести uint8_t к int, чтобы напечатать его, как я привык с int (т.е. используя *p). Если я не произношу, печатается какой-то странный символ (новая строка плюс пробел?). Почему это так?

Будут ли у меня проблемы при использовании *p для индексации другого массива (без приведения)?

...