指针数组的问题
#include <stdio.h>
void main()
{
char *p[4]={ "hello ", "world ", "come ", "on "};
int i;
for(i=0;i <4;++i)
{
printf( "%x\n ",p[i]);
}
}
输出的地址是:420030 420028 420020 42001c
请问这个地址怎么没规律啊?指针数组是如何开辟内存空间存放数据的呢?
[解决办法]
首先一点,这个地址很有规律吧?!!!!!
char *p[4]={ "hello ", "world ", "come ", "on "};
输出的地址是:420030 420028 420020 42001c
很容易可以看出来,按照16进制,地址的差是8,8,4,字符串的长是5,5,4,2,占用空间长是6,6,5,3(附带有字符串结束符),按照字节对齐要求,实际占用内容大小应该是都对齐到4n,也就是8,8,8,4
那么内存按照向低地址端申请空间,一份空间内按向高地址空间存放数据的原则的话,第一个分配到420030,占用8字节,到420038,而向低地址延伸,申请下一个8字节大小的时候就该是420030-8=420028,又占用8字节,到42002f,以此类推,接下来的第三个应该在420028-8=420020,第三个应该是420020-4=42001c,这个应该是很规律的吧?????????????
再就是你分配的是数组指针的数组,也就是4个指针分别指向了四个常量字符串,对于常量字符串的地址不是数组的地址,所以说你想输出得是实际应该是
char p[4][]={ "hello ", "world ", "come ", "on "};对应的p[i],可是c++不支持动长数组,所以这个东东编译不过去,只能指定为char p[4][6]={ "hello ", "world ", "come ", "on "};或者char p[4][8]={ "hello ", "world ", "come ", "on "};,这样的结果才是你想研究的结果........
(对应的结果是12ff48 12ff4e 12ff54 12ff5a,或者12ff40 12ff48 12ff50 12ff58)
还有,也就是程序简单,堆里的碎片比较少,如果堆内碎片巨多无比的时候,呵呵,那为这四个常量字符串分配的空间才真叫一个没有规律呢,看得才让人崩溃喔~~~~~~~~~~~