C语言数组指针内存释放

int _tmain(int argc, _TCHAR* argv[])
{

int (*b)[3];
b=(int (*)[3])malloc(sizeof(int *)*3);
for(int i=0;i<2;++i)//这里用i<3就不行,为什么
b[i][0]=234;
for(int i=0;i<2;++i)//这里也不能<3
printf("%d\n",b[i][0]);
free(b);//运行到这里程序就停止工作了,我应该怎样释放内存
return 0;
}
求大佬讲解,谢谢~

//用指针的指针当二维数组请参考以下代码 
#include <stdio.h>
#include <stdlib.h>
int main(){
int **b;
b=(int **)malloc(sizeof(int *)*4);   //二维数组b有4行 

for(int i=0;i<4;i++)    //替每行分配存储空间 
b[i]=(int *)malloc(sizeof(int)*3);  //二维数组b每行3列 

for(int i=0;i<4;++i) for(int j=0;j<3;j++)
b[i][j]=i*j;

for(int i=0;i<4;++i) {
for(int j=0;j<3;j++) 
printf("%5d",b[i][j]);
printf("\n");
}

for(int i=0;i<4;i++)
free(b[i]);  //释放每行的存储空间 
free(b);//释放b
return 0;
}

追问

你好,很感谢你能回答我的问题。这个方法也能解决我的问题,但是我想寻求一种更简便的方法,就是用数组指针,这样只用替每行申请内存而不用替每列申请内存了。所以我才遇到了那样的问题。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-05-26
b=(int (*)[3])malloc(sizeof(int *)*3);的意思是“申请了12个字节,并把首地址强制为int (*)[3]型赋给b。现在假设b指向的地址是40000000H,那么b+1指向的地址就是4000000CH,已经跳过12个字节了,哪里还有b+2的位置?越界了!b[i][0]=234;的类型也与申请的不匹配——申请的空间是存放int (*)[3]型指针的,现在指针还没有确定值,就给指针指向的目标赋值了,自然也是错误的!你这样弄要干什么我没有看明白,所以不便改,只指出错误。追问

你好,首先很感谢你能回答我的问题,现在我将问题描述的再详细一点。
int (*b)[3];//定义数组指针,相当于定义一个二维数组行数不确定但列数是三
b=(int (*)[3])malloc(sizeof(int *)*3);//为数组指针申请三行内存,相当于b[3][3]
b[i][0]=234;数组指针可以当做二维数组用,目前i<2不越界,但i<3好像就越界了
free(b);释放内存出现了问题,求解答,可能以上我的认知也有问题。

追答

“b=(int (*)[3])malloc(sizeof(int *)*3);//为数组指针申请三行内存,相当于b[3][3]
b[i][0]=234;数组指针可以当做二维数组用”——这个理解是错的!b=(int (*)[3])malloc(sizeof(int *)*3);只申请了12个字节,并没有申请每行3元素的三行内存;相当于b[3][3]也是错误理解:b是int (*)[3]型指针,当数组名用时b[1]与b[0]就要相差12个字节((*)[3]是3个int元素的指针,3个int元素是12个字节),可这里只申请了12个字节,所以b[2]肯定就越界了。另:把b当数组用时是存放int (*)[3]型指针的,现在指针还没有着落,就开始用b[i][0]=234;给指针指向的目标赋值,肯定也是错误的。

追问

你好,b=(int (*)[3])malloc(sizeof(int *)*3);并没有只申请了12个字节,(int *)已经是(int*3)了,所以(int*)*3是36个字节,而且我通过vs2010单步跟踪调试证明这句执行后b[3][3]的三行三列都已经成功申请了内存。

追答

(int*)*3是36个字节——那是你想当然——看下面的代码结果——

一个int *怎么可能是12个字节?它只有4个字节!

追问

不是的,主要是我定义的是指针数组(*P)[3],看后面这个[3],它定义了每个(int*)是3*int,所以(int*)*3是(3*int)*3,一共36个字节,我的截图已经证明我申请成功了。

追答

你的追问理解完全错误——malloc函数申请的内存数目由后面()中的表达式确定,怎么能扯到前面的强制符int (*p)[3]上?int (*p)[3]只是把申请的12个字节的第一个字节的地址强制为指向有3个int型元素的数组的指针——这只使指针p增1时要跳过12个字节,不是为它分配了12个字节!

追问

谢谢谢谢,我试了试,果然是我的想法是错的,改成(int*9)就对了,非常感谢!申请成功后就当二维数组用了。

追答

好……

相似回答