c 只有前 8 个字节传递给函数
c only first 8 bytes passed to function
我正在用 micropython 开发一个 C 模块...如果我将一个字节数组传递给一个函数,只有前 8 个字节会成功(根据 sizeof)。我还必须发送长度,然后复制它以访问函数中的所有内容。
static void printSomeBytes(char *description, byte *bytes)
{
printf("\r\n%s: ", description);
for (int i = 0; i < sizeof(bytes); ++i )
{
printf("%02X", bytes[i]);
}
}
static void printAllBytes(char *description, byte *bytes, int length)
{
byte copy[length];
memcpy(copy, bytes, length);
printf("\r\n%s: ", description);
for (int i = 0; i < sizeof(copy); ++i )
{
printf("%02X", copy[i]);
}
// this also works without making a copy
//for (int i = 0; i < length; ++i )
//{
// printf("%02X", bytes[i]);
//}
}
byte Kifd[] = { 0x0B, 0x79, 0x52, 0x40, 0xCB, 0x70, 0x49, 0xB0, 0x1C, 0x19, 0xB3, 0x3E, 0x32, 0x80, 0x4F, 0x0B};
printSomeBytes("Kifd", kifd); // prints "Kifd: 0B795240CB7049B0"
printAllBytes("Kifd", kifd, sizeof(kifd)); // prints "Kifd: 0B795240CB7049B01C19B33E32804F0B"
我做错了什么/是否有更好的方法将指向字节数组的指针发送给函数?
您对问题的解释很糟糕。你是说 sizeof(bytes)
returns 8?
bytes
是一个指针,sizeof(bytes)
返回该指针的大小。指针在您的系统上可能是 8 个字节。这与它指向的地址的字节数无关。
在 C 中,当您获得一个指针时,无法知道它指向多少字节,除非您将该信息作为另一个参数提供或在数据中有一个特殊的终止值。
sizeof(bytes)
return 是指向 byte
的指针需要存储在内存中的字节数。它不会 return 你 bytes
指向的数组包含的字节数。
为此,您需要将该尺寸传递给函数:
static void printSomeBytes(char *description, byte *bytes, size_t size)
{
printf("\r\n%s: ", description);
for (size_t i = 0; i < size; ++i )
{
printf("%02X", bytes[i]);
}
puts("");
}
编辑
我还在那里添加了 puts("")
以便立即打印字节。笔记
printf
已缓冲,除非您刷新它,否则它不会在屏幕上显示输出
(fflush(stdout);
) 手动或在 printf
末尾添加一个 '\n'
换行符。
puts(string)
等同于 printf("%s\n", string);
但没有
必须解析格式参数的开销。
结束编辑
然后调用它:
byte Kifd[] = { 0x0B, 0x79, 0x52, 0x40, 0xCB, 0x70, 0x49, 0xB0, 0x1C, 0x19, 0xB3, 0x3E, 0x32, 0x80, 0x4F, 0x0B};
printSomeBytes("Kifd", Kifd, sizeof Kifd / sizeof *Kifd);
获取数组元素数量的正确方法是:
sizeof array / sizeof *array
即使您知道类型是 8 位,我也鼓励您使用该公式
长。它使代码更具可移植性。
我正在用 micropython 开发一个 C 模块...如果我将一个字节数组传递给一个函数,只有前 8 个字节会成功(根据 sizeof)。我还必须发送长度,然后复制它以访问函数中的所有内容。
static void printSomeBytes(char *description, byte *bytes)
{
printf("\r\n%s: ", description);
for (int i = 0; i < sizeof(bytes); ++i )
{
printf("%02X", bytes[i]);
}
}
static void printAllBytes(char *description, byte *bytes, int length)
{
byte copy[length];
memcpy(copy, bytes, length);
printf("\r\n%s: ", description);
for (int i = 0; i < sizeof(copy); ++i )
{
printf("%02X", copy[i]);
}
// this also works without making a copy
//for (int i = 0; i < length; ++i )
//{
// printf("%02X", bytes[i]);
//}
}
byte Kifd[] = { 0x0B, 0x79, 0x52, 0x40, 0xCB, 0x70, 0x49, 0xB0, 0x1C, 0x19, 0xB3, 0x3E, 0x32, 0x80, 0x4F, 0x0B};
printSomeBytes("Kifd", kifd); // prints "Kifd: 0B795240CB7049B0"
printAllBytes("Kifd", kifd, sizeof(kifd)); // prints "Kifd: 0B795240CB7049B01C19B33E32804F0B"
我做错了什么/是否有更好的方法将指向字节数组的指针发送给函数?
您对问题的解释很糟糕。你是说 sizeof(bytes)
returns 8?
bytes
是一个指针,sizeof(bytes)
返回该指针的大小。指针在您的系统上可能是 8 个字节。这与它指向的地址的字节数无关。
在 C 中,当您获得一个指针时,无法知道它指向多少字节,除非您将该信息作为另一个参数提供或在数据中有一个特殊的终止值。
sizeof(bytes)
return 是指向 byte
的指针需要存储在内存中的字节数。它不会 return 你 bytes
指向的数组包含的字节数。
为此,您需要将该尺寸传递给函数:
static void printSomeBytes(char *description, byte *bytes, size_t size)
{
printf("\r\n%s: ", description);
for (size_t i = 0; i < size; ++i )
{
printf("%02X", bytes[i]);
}
puts("");
}
编辑
我还在那里添加了 puts("")
以便立即打印字节。笔记
printf
已缓冲,除非您刷新它,否则它不会在屏幕上显示输出
(fflush(stdout);
) 手动或在 printf
末尾添加一个 '\n'
换行符。
puts(string)
等同于 printf("%s\n", string);
但没有
必须解析格式参数的开销。
结束编辑
然后调用它:
byte Kifd[] = { 0x0B, 0x79, 0x52, 0x40, 0xCB, 0x70, 0x49, 0xB0, 0x1C, 0x19, 0xB3, 0x3E, 0x32, 0x80, 0x4F, 0x0B};
printSomeBytes("Kifd", Kifd, sizeof Kifd / sizeof *Kifd);
获取数组元素数量的正确方法是:
sizeof array / sizeof *array
即使您知道类型是 8 位,我也鼓励您使用该公式 长。它使代码更具可移植性。