不寻常的C指针行为

时间:2014-05-14 14:42:34

标签: c pointers

我有以下代码片段:

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数组中。

1 个答案:

答案 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;不需要支持任何标准库函数,但您的可能支持托管标准库的某些子集。