内存分配,根据系统与编译器的不同,差别很大。
之前曾经发现在ubuntu12.04系统gcc 4.63版本编译器,先定义的局部变量在栈中地址低,而后定义的局部变量在栈中地址高,与认知有差别。试了多个系统与编译器,最后发现与linux发行版关系不大,而与gcc的版本有关。在gcc4.4.7版本和4.8.0版本中,栈中的内存地址分配“正常”。
今天又因为一个问题,对这个问题进行了进一步的探索。
试验之后,得到如下的大致结论。
gcc 4.47 ubuntu 12.04环境中,在栈中定义多个变量时:
同类型的,单元素数组按单元素算。从高到低,从元素到数组(数组在低地址)。
不同类型的,要考虑对齐与补齐。整体上,短类型的在高地址上。
gcc 4.63 ubuntu 12.04环境中,在栈中定义多个变量时:
同类型的,单元素数组按单元素算。从低到高,数组在低地址。
不同类型的,要考虑对齐与补齐。整体上,短类型的在高地址上。
附两个代码,区别只在strcpy的参数上。如果用gcc4.6.3编译第二个版本,执行时会报错:stack smashing detected

1 // gcc4.6.3中内存的问题 2 #include <stdio.h> 3 #include <string.h> 4 int main(void) 5 { 6 char s[4] = {}; 7 char s2[4] = {}; 8 printf("&s = %p ", &s); 9 printf("&s2 = %p ", &s2); 10 strcpy(s, "abcd1234"); 11 printf("%s ", s); 12 printf("%s ", s2); 13 return 0; 14 }

1 // gcc4.4.7中内存的问题 2 #include <stdio.h> 3 #include <string.h> 4 int main(void) 5 { 6 char s[4] = {}; 7 char s2[4] = {}; 8 printf("&s = %p ", &s); 9 printf("&s2 = %p ", &s2); 10 strcpy(s2, "abcd1234"); 11 printf("%s ", s); 12 printf("%s ", s2); 13 return 0; 14 }