首页 > 编程语言 > 详细

二维数组的动态分配

时间:2016-04-11 10:21:37      阅读:137      评论:0      收藏:0      [点我收藏+]

参见:http://blog.csdn.net/handsome_926/article/details/8233744

参见:http://blog.csdn.net/gaohuaid/article/details/10822851

32位(bit)和64位(bit)系统的指针占的内存不一样,注意B与b不同,B是Byte(字节),b是bit(位) 1GB=1024MB,1MB=1024KB,1KB=1024B,1B=8bit

在32位的系统中,所有指针都占4 bytes。cpu决定内存的编址,如32位CPU有32条地址总线,对应的地址格式为 10 01 .... 01 01 = 32bit =4byte,32位的系统其寻址能力为32个二进制位,应该是4个字节的长度,指针大小是4byte.

64位 -> 01 01 10 10 ....01 = 64bit =8byte,64位的系统其寻址能力为64个二进制位,应该是8个字节的长度,所以指针大小是8byte。以下都是内容都是32位系统指针。

二维都未知

 1 char **a;
 2  
 3 int i;
 4  
 5 a = (char **)malloc(sizeof(char *) * m);     //分配指针数组
 6  
 7 for(i=0; i<m; i++)
 8  
 9 {
10  
11     a[i] = (char *)malloc(sizeof(char) * n); //分配每个指针所指向的数组
12  
13 }
14  
15 printf("%d\n", sizeof(a));    //4,指针
16  
17 printf("%d\n", sizeof(a[0])); //4,指针
18  
19 for(i=0; i<m; i++)
20  
21 {
22  
23     free(a[i]);
24  
25 }
26  
27 free(a);

注意:编译器在处理如上代码时,并不是真的就给每行分配n个int大小的内存空间,在gcc 4.7.2-2中,通常会多分配一个int大小的内存空间,而在VC6.0中会多分配14个。也就是说,这种方法分配的内存,每行之间存在空隙。

例如:当你访问a[0][n]的时候,并不是访问了a[1][0],这个时候会发生数组越界,返回错误的值。

 

二维都未知,一次分配内存(保证内存连续性)

 1 char **a;
 2  
 3 int i;
 4  
 5 a = (char **)malloc(sizeof(char *) * m);    //分配指针数组
 6  
 7 a[0] = (char *)malloc(sizeof(char) * m * n);//一次性分配所有空间
 8  
 9 for(i=1; i<m; i++)
10  
11 {
12  
13     a[i] = a[i-1] + n;
14  
15 }//采用如上内存分配方法,意味着将a的值初始化为m*n的二维数组首地址,且这块内存连续
16  
17 printf("%d\n", sizeof(a));    //4,指针
18  
19 printf("%d\n", sizeof(a[0])); //4,指针
20  
21 free(a[0]);
22  
23 free(a);

 

二维数组的动态分配

原文:http://www.cnblogs.com/bixiongquan/p/5377181.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!