二重指针分配矩阵内存并初始化

来源:互联网 发布:宁波网络机柜回收 编辑:程序博客网 时间:2024/04/30 10:53

首先要明白的是:int **a ;  a为(指向int类型的指针)的指针

METHOD 1:

先分配内存malloc

1.如果后面初始化赋值了,后面就不用了

2.如果后面没有赋值,需要memset了

如果说我临时需要一块内存,这块内存用来存储n个int的变量。我就需要使用malloc为pMax分配一块内存。可以这样做:
pMax = malloc(sizeof(int) * n);
if (pMax == NULL) // 错误处理
{ TODO...}
这样我们就为pMax分配了一块内存大小为sizeof(int) *n 字节的内存。这里malloc返回一个指向这块内存的首地址并将它赋给了int型指针变量pMax.
好了,pMax已经可以使用了。我们需要对它进行初始化。这个可以使用memset函数
memset(pMax, 0 , sizeof(int) * n);

//指针在后面进行了初始化

unsigned char **Image_Array=NULL;//声明一个二位指针,指向指针的指针,

unsigned char **Image_Array;
Image_Array=(unsigned char**)malloc(sizeof(unsigned int*)*lHeight);//指针是int*长度
if(Image_Array==NULL)
{
exit(-2);
}
for(int m=0;m<lHeight;m++)
{
Image_Array[m]=(unsigned char*)malloc(sizeof(unsigned char)*lWidth);
if(Image_Array[m]==NULL)
{
exit(-3);
}
}

for(int j=0; j<lHeight; j++) 

{

 lpSRCDIBBits_Pixel=(unsigned char *)lpSRCDIBBits+(j*SrcDIBLineBytes); 

for(int i=0; i<lWidth; i++)

 { 

Image_Array[lHeight-j-1][i] = (unsigned char )(*(lpSRCDIBBits_Pixel++)); //变换灰度

}

 } 


METHOD2:

使用new

定义一个二维数组 
char **array 
array = new char *[lHeight]; //已经初始化
for(i=0;i<lHeight;++i) 
array[i] = new char[lWidth]; 
...用的时候可以直接array[i][j] 
注意delete 
for(i=0;i<x;++i) 
delete[] array[i]; 
delete[] array; 

for(int j=0; j<lHeight; j++) 

{

 lpSRCDIBBits_Pixel=(char *)lpSRCDIBBits+(j*SrcDIBLineBytes); 

for(int i=0; i<lWidth; i++)

 { 

Image_Array[lHeight-j-1][i] = (unsigned char )(*(lpSRCDIBBits_Pixel++)); //变换灰度

}

 } 


VC调试时遇到的指针信息

0xCDCDCDCD堆上分配的地址,但是没有初始化

0xDDDDDDDD堆上释放的地址。

0xFDFDFDFD堆内存的边界

0xCCCCCCCC栈上分配的内存,但是没有初始化

指针的初始化

初看起来,指针的初始化和赋值好像很混乱,又是*,又是&,时不时又出来一个数组。其实总结起来很简单:int *p;int a=25;int b[10];int *m=&a;int *n=b;int *r=&b[0];指针的定义如上所示,以*打头的变量代表该变量为指针变量。指针初始化时,“=”的右操作数必须为内存中数据的地址,不可以是变量,也不可以直接用整型地址值(但是int *p=0;除外,该语句表示指针为空)。此时,*p只是表示定义的是个指针变量,并没有间接取值的意思。