一个极具挑战性的全局变量地址分配问题
如何让全局变量分配的地址是连续的?举个例子来说明一下,假如我有如下test.h,test.c,test2.c三个文件,我如何才能让
P0001,P0002,P0003(实际应用中更多)分配到的地址是连续的,不管它分配的是多少,只要连续就可以。如果只有test.h 和
test.c,我将test.h修改为这样:
/*******************************************************************/
//test.h :
unsigned char P0001 = 0 ;
unsigned char P0002 = 0 ;
unsigned char P0003 = 0 ;
/********************************************************************/
就可以,得到PP0001,P0002,P0003的地址就是连续的,可是如果要编译如下的三个文件,这样在定义时初始化变量编译就会报错:
/tmp/ccYe951o.o(.data+0x0): multiple definition of `P0001 '
/tmp/cck3EwMC.o(.data+0x0): first defined here
/tmp/ccYe951o.o(.data+0x1): multiple definition of `P0002 '
/tmp/cck3EwMC.o(.data+0x1): first defined here
/tmp/ccYe951o.o(.data+0x2): multiple definition of `P0003 '
/tmp/cck3EwMC.o(.data+0x2): first defined here
向高手求教解决方案,另外用GCC编译时如何生成MAP文件?
/*******************************************************************/
//test.h :
unsigned char P0001 ;
unsigned char P0002 ;
unsigned char P0003 ;
/********************************************************************/
//test.c :
#include "test.h "
#include <stdio.h>
extern void test2(void);
main()
{
P0002 = 0;
P0003 = 0;
P0001 = 0;
printf( "&P0001 = %d,&P0002 = %d,&P0003 = %d\n ",&P0001,&P0002,&P0003);
test2();
}
/*************************************************************************/
//test2.c :
#include "test.h "
#include <stdio.h>
test2()
{
P0001 = 1;
P0002 = 2;
P0003 = P0001 + P0002;
printf( "&P0001 = %d,&P0002 = %d,&P0003 = %d\n ",&P0001,&P0002,&P0003);
/**************************************************************************/
[解决办法]
如果类型一致的话,可以考虑用全局数组,这样肯定是连续的。
// test.h
extern unsigned char p[3];
extern void test2();
// test.c
#include <stdio.h>
#include "test.h "
int main()
{
printf( "&P[0] = 0x%x, &P[1] = 0x%x,&P[2] = 0x%x\n ",&P[0],&P[1],&P[2]);
return 0;
}
// test2.c
#include <stdio.h>
#include "test.h "
unsigned char p[3] = { 0 };
void test2()
{
P[0] = 1;
P[1] = 2;
P[2] = P[0] + P[1];
printf( "&P[0] = 0x%x, &P[1] = 0x%x,&P[2] = 0x%x\n ",&P[0],&P[1],&P[2]);
}
[解决办法]
不同类型,即使用结构体,有些编译器考虑边界对齐,变量之间可能会有空隙,所以地址也就不一定连续。当然这通过强制编译器按字节对齐解决
[解决办法]
我个人感觉~好象makefile里面,只要是连续定义的全局变量都会放在一起哦.
而且你出的那个错,应该就是因为在全局变量.h中有初始值,而且这个.h文件被重复包含;
最好只是在.h中声明,定义放到.c中.
我的想法是,如果要为一系列的全局变量分配空间,最好是先申请足够容纳所有全局变量的空间,比如使用int storage[size] = {0};
然后每个全局变量都使用指针,指向storage内的地址.offset为每个变量的大小.
这样就可以保证全局变量都在一段连续的空间分配了.
------解决方案--------------------
如果类型不一致,你可以一次性申请一块足够包含你所有信息的内存,然后通过指针的类型转换,将不同的值赋给不同的内存,不过这样挺麻烦的,如果是类型一致的,应该考虑用数组,那样地址肯定是连续的了