在C语言采访中我被问到一个问题。 问题是:
int *point;
'0x983234' is a address of memory;//I can not remember exactly
我们怎么能为那个记忆分配20? 它看起来像一个嵌入式编程问题,任何人都可以解释我吗?
答案 0 :(得分:7)
我怀疑这是一个嵌入式编程问题,而且你是在稍微错误地记错了。这可能是 -
int *point = (int *) 0x983234;
*point = 20;
当存在要在地址0x983234处读/写的寄存器时,嵌入式程序员会做类似的事情。
答案 1 :(得分:5)
首先,您必须将指针设置为正确的地址(以便它指向您需要的地方)。 然后,要在该地址处写入,您可以取消引用指针并执行赋值。它看起来像这样:
int main ()
{
volatile int *point = (int *)0x983234;
*point = 20;
return 0;
}
请注意volatile
个关键字。建议使用它,以便编译器不做任何假设并对其进行优化。
如果您要存储更大的数据块,请使用memcpy
或memmove
与该地址一起从/向其复制数据,如下所示:
#include <string.h>
int main ()
{
const char data[] = "some useful stuff";
memcpy ((char *)0x983234, data, sizeof (data));
return 0;
}
答案 2 :(得分:1)
我使用这种方法来做它。好处是你不需要另一个变量(指针)。 假设您要将地址0x00002dbd的uint8_t类型的变量设置为200.您可以简单地编码:
*(uint8_t*)0x00002dbd=200;
或者如果你有一个包含uint8_t变量地址的uint32_t变量(不是指针),你可以这样做:
uint32_t x;
x=0x00002dbd;
*(uint8_t*)x=200;
目标变量的类型无关紧要。只是类型而不是uint8_t部分。