读书人

去指定内存写入数据是否可行

发布时间: 2013-07-26 11:27:42 作者: rapoo

往指定内存写入数据,是否可行?
在地址0x67a9上,写入一个int 0xaa66;

void * a = 0x67a9 ;

int b = 0xaa66;
memcpy(a,&b,sizeof(int));


我想这样,编译过不了。

C语言是否有 在指定地址上 分配内存的能力?
以上命题是否可实现?
[解决办法]
嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。

  这一问题测试你是否知道为了访问一绝对地址把一个整型数强制转换(typecast)为一指针是合法的。这一问题的实现方式随着个人风格不同而不同。典型的类似代码如下:
int *ptr;
ptr = (int *)0x67a9;
*ptr = 0xaa55;

A more obscure approach is:

  一个较晦涩的方法是:
*(int * const)(0x67a9) = 0xaa55;

  即使你的品味更接近第二种方案,但我建议你在面试时使用第一种方案。

[解决办法]
引用:
在地址0x67a9上,写入一个int 0xaa66;

void * a = 0x67a9 ;

int b = 0xaa66;
memcpy(a,&b,sizeof(int));


我想这样,编译过不了。

C语言是否有 在指定地址上 分配内存的能力?
以上命题是否可实现?


编译通不过是因为把0x67a9这个常数赋值给一个指针,如果做强制类型转换void * a = (void *)0x67a9可以编译通过,但不保证0x67a9可用,通常这个地址是不可用的,所以后面的memcpy运行会出错。
[解决办法]
引用:
在地址0x67a9上,写入一个int 0xaa66;

void * a = 0x67a9 ;

int b = 0xaa66;
memcpy(a,&b,sizeof(int));


我想这样,编译过不了。

C语言是否有 在指定地址上 分配内存的能力?
以上命题是否可实现?


short *reg = 0xa7a9;
*reg = 0xaa99;

还有一种常见的写法 *(short *)(0xa7a9) = 0xaa99;
[解决办法]
个人意见,以下写法最好理解:
short int *addr = 0x000067a9;
addr[0] = 0xaa66;

读书人网 >C语言

热点推荐