【猪年第一问】关于全局数组的地址分配有关问题
【猪年第一问】关于全局数组的地址分配问题
示例代码:
struct exmStr
{
char *pa1;
char *pa2;
};
char arr[] = "123456789 ";
exmStr e1[] = { {arr, arr+1}, {arr+1, arr}, {arr, arr+2}, {arr, arr+3}, {NULL, NULL}};
exmStr e2[] = { {arr+1, arr}, {arr+1, arr}, {arr+2, arr}, {arr+3, arr}, {NULL, NULL}};
int main(int argc, char* argv[])
{
printf( "%p,%p\n ", e1, e2 );
return 0;
}
//请问数组e1,e2的首地址之差是多少?试了不同编译器,结果不同,想知道为什么?
------解决方案--------------------
c++标准并没有规定相临创建的变量的地址应该相临,所有不同的编译器有不同的实现吧!个人观点
------解决方案--------------------
1 结构体的对齐单位是否一致
2 全局数组变量间的填充字节是否一致 ~
------解决方案--------------------
1,
16位的机器,和32位的机器,和64位机器。其对齐单位不一样。
2,
搂主可以了解一下字节对齐是怎么回事。
3,
同一机器,不同编译器所实现的存放变量的方式,以及对齐方式,也各有差别。
------解决方案--------------------
上网搜一搜“内存中的数据对齐”。
《程序员面试宝典》,p44有不同编译器的相同代码运行的实例和解析。
------解决方案--------------------
没规定。不要试图依赖某个结果。
------解决方案--------------------
不同编译器不同字长的机器都是分布一样
只要了解分布原理就可以了
示例代码:
struct exmStr
{
char *pa1;
char *pa2;
};
char arr[] = "123456789 ";
exmStr e1[] = { {arr, arr+1}, {arr+1, arr}, {arr, arr+2}, {arr, arr+3}, {NULL, NULL}};
exmStr e2[] = { {arr+1, arr}, {arr+1, arr}, {arr+2, arr}, {arr+3, arr}, {NULL, NULL}};
int main(int argc, char* argv[])
{
printf( "%p,%p\n ", e1, e2 );
return 0;
}
//请问数组e1,e2的首地址之差是多少?试了不同编译器,结果不同,想知道为什么?
------解决方案--------------------
c++标准并没有规定相临创建的变量的地址应该相临,所有不同的编译器有不同的实现吧!个人观点
------解决方案--------------------
1 结构体的对齐单位是否一致
2 全局数组变量间的填充字节是否一致 ~
------解决方案--------------------
1,
16位的机器,和32位的机器,和64位机器。其对齐单位不一样。
2,
搂主可以了解一下字节对齐是怎么回事。
3,
同一机器,不同编译器所实现的存放变量的方式,以及对齐方式,也各有差别。
------解决方案--------------------
上网搜一搜“内存中的数据对齐”。
《程序员面试宝典》,p44有不同编译器的相同代码运行的实例和解析。
------解决方案--------------------
没规定。不要试图依赖某个结果。
------解决方案--------------------
不同编译器不同字长的机器都是分布一样
只要了解分布原理就可以了