C++ 中 uint8_t* 值的含义和调试(打印)

meaning and debuging (print) of uint8_t* value in c++

本文关键字:调试 打印 uint8 C++      更新时间:2023-10-16

假设我有一些数据(例如代表灰色图像像素的数字(,这些数据是从文件中读取并打包到指向uint8_t的指针中。

uint8_t* data = getData(readFile(filePath));

如果我真的理解uint8_t指针是什么,它就像一个无符号字符数组(uint8_t映射到无符号字符(,换句话说,它是指向无符号字符数组的第一个元素的指针。这是对的吗?

我的问题是:

1( 如何在 c++ 中打印值数据点?
我读到C它可以像这样完成printf(*data)printf( data[0] ).请参阅打印出值uint8_t
*但是如何在c ++中执行此操作?

2(有没有办法迭代(循环(值数据点? 像这样:

for(auto i=0; i< data.size; i++) {
auto d = data[i]; 
}

它是指向无符号字符数组的第一个元素的指针。这是对的吗?

uint8_t*是指向类型uint8_t的对象的指针。如果uint8_tunsigned char的别名,那么uint8_t*确实是指向unsigned char的指针。

它可以指向 null,也可以指向没有对象的地址(悬空指针(,也可以指向对象。那个尖头对象是否是数组的第一个元素,我们不可能说。如果getData的文档说它是,那么我们能做的最好的事情就是假设它没有说谎。如果没有文档,那么我们需要查看实现以了解它的作用。

1( 如何在 c++ 中打印值数据点?

尽管printf在C++中也可用,但众所周知,初学者很难正确使用(事实上,您的建议是不正确的(。最好,您可以从<iostream>标头将对象插入到std::cout中以打印它(使用流插入运算符<<(。例:

std::cout << data[0];

但是,如果uint8_t确实是unsigned char的别名,则数据将作为字符流式传输。如果要流式传输整数值,则需要先将该值转换为非字符整数类型:

std::cout << int(data[0]);

要打印数组等数据结构,您可以遍历数组并打印每个元素,

2(有没有办法迭代(循环(值数据点?

是的。

但是,为了迭代数组,您需要以某种方式知道何时停止迭代。这与知道数组的结束位置相同。这也是getData的文档应该揭示的东西。数组的长度是否恒定?数组是否以某个值终止?它是否设置了一些全局变量来为我们提供数组的长度?或;我们无法知道。

您可以使用以下算法:

1 let the pointer point to the first element of the array
2 if the pointer points to the end of the array, you're done
3 indirect the pointer to get the value at current index
4 you you can now for example print the value
5 increment the pointer
6 jump to 2

用 c++ 打印printf("%d", data[0] )改用std::cout << data[0];printf("%d", *data )std::cout << *data;

请注意,std::cout <<根据数据类型进行格式化,如果您想更改某些内容,则需要更多:例如#include <iomanip>.

此外,当您使用指针(在 C 或 C++ 中无关紧要(时,在指针有效之前不应访问数据。至少选中data != NULL,然后在表达式中使用*data

最重要的是 - 如果datauint8_t* data;一样是指针,它没有属性(字段(data.size,所以循环应该以其他方式组织。我的意思是,你必须找到其他方法来知道该指针有多少数据可用......例如:

size_t size = ... // calculate the length of array before loop
for (size_t cnt = 0; cnt < size; cnt++) {
std::cout << data[cnt];
}

或者,当数组末尾由特殊值定义时,它可以是:

uint8_t* ptr = data;
while ( *ptr != END_MARKER ) {
std::cout << *ptr;
ptr++;
}

更新:

如果不是uint8_t*而是像队列结构这样的薄

typedef struct{
uint8_t    data;
QueueItem* next;
} QueueItem;

NULL指针本身可以是END_MARKER的,例如:

QueueItem* ptr = queue;
while ( ptr != NULL ) {
std::cout << ptr->data;
ptr = ptr->next;
}