我有一个uint8_t
类型数组,4x4维度,我使用嵌套for循环显示数组,十六进制值通过sprintf()
转换为十六进制字符串。
void hexD(uint8_t state[4][4])
{
char x[2];
for(int i = 0; i < 4; i++)
{
cout << "\n";
for(int j = 0; j < 4; j++)
{
cout << j <<"\n"; //displays the value of j
sprintf(x, "%x", state[i][j]);
cout << x << "\t";
}
}
}
问题是内部for循环无休止地运行,因为j的值从0开始然后是1然后是2但是不是转到3它会回到1,j在1和2之间交换,因此循环无限运行。
任何解决方案。
感谢。
答案 0 :(得分:0)
您的x
只有两个空格,但您要在其中写入更多字符。例如,十六进制0
为"00"
,两个字符加上结束 '\0'
。
这会覆盖邻近的内存,而你的j
恰好在那里并被覆盖。
增加x[]
的大小,它应该有效。
答案 1 :(得分:0)
根据state[4][4]
中的值,您很可能会结束
溢出x
数组(请记住,对于终止FF
,您最多需要一个'\0'
(2个字符)+ 1的位置。
这是未定义的行为。
修复它(char x[3];
),你应该没问题。这是mcve:
#include <iostream>
#include <cstdint>
#include <cstdio>
using namespace std;
void hexD(uint8_t state[4][4])
{
char x[3];
for(int i = 0; i < 4; i++)
{
cout << "\n";
for(int j = 0; j < 4; j++)
{
cout << j <<"\n"; //displays the value of j
sprintf(x, "%x", state[i][j]);
cout << x << "\t";
}
}
}
uint8_t state[4][4]={
255,255,255,255,
0, 1, 2, 3,
0, 1, 2, 3,
0, 1, 2, 3,
};
int main()
{
hexD(state);
}
答案 2 :(得分:0)
x & y
你的&#34;十六进制输出只有两个字节&#34;但没有char x[2];
字符的可用空间。
将更多内容写入容量较小的数组未定义的行为。
将null
数组大小增加到3:
x
因为按sprintf
:
终止空字符会自动附加到 内容。
因此,您总共有三个字符包括 char x[3];
个字符。