gpt4 book ai didi

c - 异常的 C 指针行为

转载 作者:太空宇宙 更新时间:2023-11-04 08:40:50 24 4
gpt4 key购买 nike

我有以下代码片段:

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

最佳答案

uint8_t     *ptrconfig;
...
ptrconfig = &TempDeviceConfig.ConfigSize;

显然 TempDeviceConfig是一个结构(或 union ?),并且ConfigSize是类型为 uint8_t 的成员.

*ptrspi++ = *ptrconfig++;

ConfigSize是单uint8_t目的。您只能将指针前进一次;然后它指向刚刚经过的对象,并且不能被取消引用。您的代码假定 ptrconfig指向 uint8_t 数组的一个元素.它没有。遍历单个对象没有意义。

如果没有看到您正在使用的对象的声明,我无法猜测代码应该做什么。但是,如果您打算将整个结构(包括任何填充)复制到 spi_out_array 中, 调用 memcpy()是一种更简单的方法。 (将原始结构内容复制到外部接口(interface)可能很容易出错,但如果写入的数据仅由当前系统读取,则可能没问题。)

如果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> 中声明)。 “独立实现”不需要支持任何标准库函数,但您的实现可能支持托管标准库的某些子集。

关于c - 异常的 C 指针行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23657897/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com