参见: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);
时间: 2024-11-08 20:42:46