c-指向struct的指针是如何显示错误值的



我将ARM-M4与GCC一起用于ARM(10_2021.10(我遇到了一个问题,指向结构的指针显示了错误的值。

__copy_table_start__在链接器文件中定义,我看到它在映射文件中的位置,这就是我如何找到它的真实值(这些值是有意义的,它们是正确的(

这是我的代码

#pragma GCC optimize("O0")
static void DataInit(void)
{
typedef struct {
uint32_t const* src;
uint32_t* dest;
uint32_t  wlen;
} __copy_table_t;
extern const __copy_table_t __copy_table_start__;
extern const __copy_table_t __copy_table_end__;
extern const __zero_table_t __zero_table_start__;
extern const __zero_table_t __zero_table_end__;
static volatile __copy_table_t const* pTable;

pTable = &__copy_table_start__;
for (; pTable < &__copy_table_end__; ++pTable) {
for(uint32_t i=0u; i<pTable->wlen; ++i) {
pTable->dest[i] = pTable->src[i];
}
}
}

pTable = &__copy_table_start__;之后的调试器中,我看到的是:

__copy_table_start__.src = 0x14A0D380
__copy_table_start__.dest = 0x00100000
__copy_table_start__.wlen = 0x38A
pTable->src = 0x14A0D380
pTable->dest = 0x14A0D380
pTable->wlen = 0x14A0D380

怎么可能呢?

更新:我又做了一个实验,创建了另一个结构变量和指向该变量的指针,得到了相同的结果。我第一次看到这种行为。

const __copy_table_t mine = {(uint32_t const*)0x12345678, (uint32_t *)0x00004545, 0x89890000};
static volatile __copy_table_t const* my_ptr;
my_ptr = &mine;

结果表明my_ptr->src = my_ptr->dest = my_ptr->wlen = 0x12345678

显然问题出在Keil(IDE(上。它显示了错误的值。

当我创建了3个新参数并将数据加载到它们时:

my_src = (uint32_t)pTable->src;
my_dest = (uint32_t)pTable->dest;
my_len = (uint32_t)pTable->wlen;

这些参数得到了正确的值。让我失望的是,调试中的一个步骤跳过了整个for循环(第一个(,就好像内部的for循环什么都没做一样。它实际上做了它应该做的事情,但有一个本应在那之后重置的参数没有在IDE中更新。

相关内容

最新更新