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;
}
求大佬讲解,谢谢~
你好,很感谢你能回答我的问题。这个方法也能解决我的问题,但是我想寻求一种更简便的方法,就是用数组指针,这样只用替每行申请内存而不用替每列申请内存了。所以我才遇到了那样的问题。
你好,首先很感谢你能回答我的问题,现在我将问题描述的再详细一点。
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)就对了,非常感谢!申请成功后就当二维数组用了。
追答好……