二维数组的动态分配

参见: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

二维数组的动态分配的相关文章

二维数组的动态分配(new)、初始化(memset)和撤销(delete)

来自http://blog.csdn.net/maverick1990/article/details/22829135 一维数组 动态分配,int *array = new int[10] 初始化,memset(array,0,sizeof(array)); 撤销,delete[] array 二维数组m行n列 int **d; d = new int *[10]; for(int i =0;i<10;i++){ d[i] = new int[5] } 先分配一个10单元的数组指针的指针的首地

【转载】二维数组的动态分配和参数传递

本篇随笔为转载,原贴地址:http://www.cnblogs.com/bigshow/archive/2009/01/03/1367661.html. 1. C语言动态分配二维数组 (1)已知第二维 Code-1 char (*a)[N];//指向数组的指针 a = (char (*)[N])malloc(sizeof(char *) * m); printf("%d\n", sizeof(a));//4,指针 printf("%d\n", sizeof(a[0]

C++ 二维数组/多维数组的动态分配(new)和释放(delete)

1. 一维数组 对于简单的一维数组动态内存分配和释放,如下: int *array1D;//假定数组长度为m //动态分配空间 array1D = new int [m]; //释放 delete [] array1D; 2. 二维数组 二维数组的动态分配和释放 //假定数组第一维长度为m, 第二维长度为n //动态分配空间 <pre name="code" class="cpp">int **array2D<span style="fo

C/C++上二维数组的两种动态分配内存方法

最近在看一个程序的源代码的时候了解到了二维数组的动态分配空间以及释放的方法,在此记录. 一.二维数据的内存空间动态分配 方法一: void malloc2D_1(int **&a) { a = new int*[xDim]; for(int i=0;i<xDim;i++) a[i] = new int[yDim]; assert(a!=NULL); } int main() { int **arr = NULL; malloc2D_1(arr); } 首先arr是一个二级指针,为arr分配x

C++二维数组做函数参数

二维数组做函数参数的形式主要有: /对于一个m行n列int元素的二维数组 //函数f的形参形式 f(int daytab[m][n]) {...} //以下两种可以忽略行数 f(int daytab[][n]) {...} f(int (*daytab)[n]) {...} 这里都不能忽略第二维的大小.主要 原因是二维数组在栈内分配的内存是连续的,它的每一行都有相同的元素,这样,array[i][j] 和 *(*(array +i) +j)是一样的,程序是知道array+i的i实际上偏移了i*N

C语言动态分配二维数组内存

C语言内存管理主要包括malloc().remalloc().free()三个函数. malloc原型 extern void *malloc(unsigned int num_bytes); m行n列的 二维数组的分配,主要有三种方法: 一.分配一个长度为m的二级指针,指针的指向的内容分别指向一个长度为n的一位数组 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h>

C语言如何动态分配二维数组

C语言如何动态分配二维数组 使用malloc().free()函数进行动态分配,这两个函数包含于stdlib.h或malloc.h中 假如要申请一个3行5列的二维数组内存 1 #include <stdlib.h> 2 int main() 3 { 4 // 为二维数组分配3行 5 int **a = (int **)malloc(3 * sizeof(int *)); 6 // 为每行分配5列 7 for(int i = 0; i < 3; i++) 8 { 9 a[i] = (int

C语言 二维数组(指针)动态分配和释放(转)

C 二维数组(指针)动态分配和释放 先明确下概念: 所谓32位处理器就是一次只能处理32位,也就是4个字节的数据,而64位处理器一次就能处理64位,即8个字节的数据.如果我们将总长128位的指令分别按照16位.32位.64位为单位进行编辑的话:旧的16位处理器,比如Intel 80286 CPU需要8个指令,32位的处理器需要4个指令,而64位处理器则只要两个指令,显然,在工作频率相同的情况下,64位处理器的处理速度会比16位.32位的更快.而且除了运算能力之外,与32位处理器相比,64位处理器

c++ 动态分配二维数组 new 二维数组

#include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { //建立一个16行5列的数组 int **p = new int*[16];//分配堆内存16个 int* for(int i = 0;i < 16;i++)//分配堆内存给每一个int* p[i] = new int[5]; //给这个数组赋值 int k = 0; f