user-0 提问: 有关几个连续整数或数组的地址问题

回复:
user: user-1
content: 1）要保证顺序存放，把变量放入结构体中定义 2）要保证变量无间隙，设置对齐为1  3）C++中 无名结构，并且 没有用它定义变量，       在 函数内部被视为变量定义       在 结构和类内部，无名结构成员变量，被视为 结构或者 类， 自己定义的成员变量。   例如  #include <iostream>  struct   point3d{             struct{             double x,y,z;};             double s; } ;  int main{         struct {          int x,y;          };         x=10;y=100;        cout<<"x="<<x<<"y="<<y;       point3d  p ={{100,200,300},4.0};       if(p.s!=0){       cout<<p.x/p.s<<"," <<p.y/p.s<<","<<p.z/p.s<<endl;         }       else{       cout<<"infinite"<<endl;        }       return 0; };

user: user-1
content: 放到一个结构体内定义就可以了

user: user-2
content: 引用 10 楼 hfdwdjl 的回复:[quote=引用 3 楼 czarten 的回复:] 你这么声明，不能保证是连续存放的吧…… 那如何才能保证连续内存？[/quote]  手动申请一块内存，用指针分别指向每块希望存储的地址。

user: user-0
content: 引用 7 楼 czarten 的回复:[quote=引用 6 楼 hfdwdjl 的回复:] [quote=引用 3 楼 czarten 的回复:] 你这么声明，不能保证是连续存放的吧…… 对啊，我就是想问一下问什么不是连续存放的； 然后如何才能连续存放？[/quote]  因为没有规定要连续存放啊，所以编译器想怎么放就怎么放 不明白你要连续存放的目的是什么 非要连续的话，手动申请一块内存然后用指针操作吧[/quote] 谢谢！！！

user: user-0
content: 引用 4 楼 buyong 的回复:不知你觉得哪里有问题？ 不连续啊……

user: user-0
content: 引用 3 楼 czarten 的回复:你这么声明，不能保证是连续存放的吧…… 那如何才能保证连续内存？

user: user-3
content: #include <stdio.h> #define field_offset(s,f) (int)(&(((struct s *)(0))->f)) struct AD  { int a; char b[13]; double c;}; #pragma pack(push) #pragma pack(1) struct A1  { int a; char b[13]; double c;}; #pragma pack(2) struct A2  { int a; char b[13]; double c;}; #pragma pack(4) struct A4  { int a; char b[13]; double c;}; #pragma pack(8) struct A8  { int a; char b[13]; double c;}; #pragma pack(16) struct A16 { int a; char b[13]; double c;}; #pragma pack(pop) int main() {     printf("AD.a %d\n",field_offset(AD,a));     printf("AD.b %d\n",field_offset(AD,b));     printf("AD.c %d\n",field_offset(AD,c));     printf("\n");     printf("A1.a %d\n",field_offset(A1,a));     printf("A1.b %d\n",field_offset(A1,b));     printf("A1.c %d\n",field_offset(A1,c));     printf("\n");     printf("A2.a %d\n",field_offset(A2,a));     printf("A2.b %d\n",field_offset(A2,b));     printf("A2.c %d\n",field_offset(A2,c));     printf("\n");     printf("A4.a %d\n",field_offset(A4,a));     printf("A4.b %d\n",field_offset(A4,b));     printf("A4.c %d\n",field_offset(A4,c));     printf("\n");     printf("A8.a %d\n",field_offset(A8,a));     printf("A8.b %d\n",field_offset(A8,b));     printf("A8.c %d\n",field_offset(A8,c));     printf("\n");     printf("A16.a %d\n",field_offset(A16,a));     printf("A16.b %d\n",field_offset(A16,b));     printf("A16.c %d\n",field_offset(A16,c));     printf("\n");     return 0; } //AD.a 0 //AD.b 4 //AD.c 24 // //A1.a 0 //A1.b 4 //A1.c 17 // //A2.a 0 //A2.b 4 //A2.c 18 // //A4.a 0 //A4.b 4 //A4.c 20 // //A8.a 0 //A8.b 4 //A8.c 24 // //A16.a 0 //A16.b 4 //A16.c 24 // //

user: user-4
content: 首先请把你第一段程序的运行截图贴出来。为什么我机器上运行前两个数组的差刚好是20个字节=foat数组的大小？（linux平台栈是向下生长的，即高地址向低地址方向）  83f884-83f868=28字节？是肯定不正确的！在windows似乎是向上生长的，应该相差count数组的大小=40字节才正确！ 其次，回答你的问题：在函数中定义的变量、数组，运行是在栈空间内，地址一般情况下是连续的（x86），但该实现与编译器、平台相关，使用这项特性是十分危险的！如果还想跨数组访问，推荐将它们定义在一个struct结构体内。

user: user-5
content: 引用 6 楼 hfdwdjl 的回复:[quote=引用 3 楼 czarten 的回复:] 你这么声明，不能保证是连续存放的吧…… 对啊，我就是想问一下问什么不是连续存放的； 然后如何才能连续存放？[/quote]  因为没有规定要连续存放啊，所以编译器想怎么放就怎么放 不明白你要连续存放的目的是什么 非要连续的话，手动申请一块内存然后用指针操作吧

user: user-0
content: 引用 3 楼 czarten 的回复:你这么声明，不能保证是连续存放的吧…… 对啊，我就是想问一下问什么不是连续存放的； 然后如何才能连续存放？

user: user-6
content: 看看汇编后结果

user: user-6
content: 不知你觉得哪里有问题？

user: user-5
content: 你这么声明，不能保证是连续存放的吧……

user: user-7
content: lz数学没学好。。。

user: user-0
content: 编译器是VS2012