我有以下代码片段:
uint8_t *ptrconfig;
uint8_t *ptrspi;
ptrconfig = &TempDeviceConfig.ConfigSize;
ptrspi = &spi_out_array[0];
for ( Count = 0U; Count < DEVICE_USER_SETTINGS_WORDCOUNT +1U; Count++ )
{
*ptrspi++ = *ptrconfig++;
}
然而,它没有按预期工作,第二行的断点显示TempDeviceConfig.ConfigSize
的地址为0x2BD5
,但指针指向的地址为0x216F
。
为什么我会得到意外的指针值?
编辑: 有点澄清,我无法准确说出TempDeviceConfig中的内容,因为我需要注意互联网上出现了多少代码,但是它是一个结构,它包含总共50多个字节。通过SPI写入外部闪存芯片。我的目标是将结构复制到发送数据的SPI数组中。
答案 0 :(得分:2)
uint8_t *ptrconfig;
...
ptrconfig = &TempDeviceConfig.ConfigSize;
显然TempDeviceConfig
是一个结构(或联合?),而ConfigSize
是一个uint8_t
类型的成员。
*ptrspi++ = *ptrconfig++;
ConfigSize
是一个uint8_t
个对象。您只能将指针前进一次;它然后指向刚刚经过的对象,并且不能被解除引用。您的代码假定ptrconfig
指向uint8_t
数组的元素。它没有。循环遍历单个对象没有意义。
我无法猜测代码应该做什么,而不会看到您正在使用的对象的声明。但如果您的意图是将整个结构(包括任何填充)复制到spi_out_array
,则调用memcpy()
是一种更简单的方法。 (将原始结构内容复制到外部接口可能非常容易出错,但如果写入的数据只能由当前系统读取,则可能没问题。)
如果因为您为小型嵌入式系统进行编程而无法使用memcpy()
,您可以自行实现它,无论是作为函数还是作为内联代码。例如:
struct foo { /* ... */ } obj;
unsigned char out_array[sizeof obj]; // or perhaps bigger
unsigned char *from = (unsigned char*)&obj;
unsigned char *to = out_array; // or &out_array[0]
for (int i = 0; i < sizeof obj; i ++) {
*to++ = *from++;
}
我已将out_array
定义为unsigned char
的数组,因为它是C中最便携的1字节类型;对象的表示被定义为unsigned char
值的序列。但你几乎可以肯定地使用uint8_t
。
如果您的目标是将结构的整个表示形式复制为原始字节,那么引用特定成员是没有意义的;只需将整个结构视为字节序列。
但首先检查您的实现是否支持memcpy
(如果是,则应在<string.h>
中声明)。 &#34;独立实施&#34;不需要支持任何标准库函数,但您的可能支持托管标准库的某些子集。