求大神帮我解答C++代码问题

#include<iostream>#include<ctime>usingnamespacestd;/*1一个三维指针char***buf;要求:1)随机生成一维、二维... #include<iostream>
#include<ctime>

using namespace std;
/*1 一个三维指针char*** buf;要求:
1)随机生成一维、二维数组长度,范围【4-16】,
随机生成数据长度【2048~4096】;
2)随机生成数据;
3)将1)、2)作为基础数据分别存储到指针数组内;
4)要求动态申请、释放内存;
*/
int main()
{
char*** buf; //三维指针
int l_counts; //数组行数
int r_counts; //数组列数
int sum; //数组长度
int length = 1; //数据长度
aa: cout<<"告诉我行数你想要多少!!!"<<endl;
cin>>l_counts;
cout<<"列数你也别控制!!!"<<endl;
cin>>r_counts;
sum = l_counts * r_counts; //数据长度
srand((unsigned)time(NULL)); //种子
if ((sum >= 4) && (sum <= 16)) {
buf = (char***)malloc(sizeof(char**)); //动态申请空间
for(int i = 0;i < l_counts;i++){
buf[i] = (char**)malloc(sizeof(char*));
for(int j = 0;j < r_counts;j++){
buf[i][j] = (char*)malloc(sizeof(char));
int num = rand()%1000; //随机数组元素
itoa(num,buf[i][j],10);
}
}
length = length*l_counts*r_counts*256;
if (length >= 2048 && length <= 4096) { //判断数据长度
for(int i = 0;i<l_counts;i++) {
for(int j = 0;j<r_counts;j++) { //输出数组
cout<<*buf[i][j]<<" ";
}
}
}else {
cout<<"数据不在范围内"<<endl;
}
//for(int i = l_counts;i > 0;i--) {
// for(int j = r_counts;j >0 ;j--) {
// free(&buf[i][j]);
// //buf[i][j] = NULL;
// }
//}
free(buf);
}else {
cout<<"让你瞎输入,得重玩了吧"<<endl;
goto aa;
}
return 0;
}
这是我写的小程序,答案能够出来但是free就会崩溃,因为这段动态申请空间的代码也是抄来的,求大神给我讲一下为什么要这么申请空间以及怎么释放,还有没有其他申请空间的办法以及如何释放,求各位大神帮忙啊~!!
展开
 我来答
百度网友4114162
2015-01-19 · TA获得超过152个赞
知道小有建树答主
回答量:164
采纳率:83%
帮助的人:64.9万
展开全部
buf = (char***)malloc(sizeof(char**));只分配了4字节,你要分配指针数组应该是
buf = (char***)malloc(sizeof(char**) * numberofpointer );
由于分配buf的时候就不对,所以后面的buf[i]=malloc都是越界操作,内存乱了。
追问
大神,我再问一下接下来的申请空间是为什么,,下面两步的空间申请我也不是很明白~~
追答

没细看你的程序,但是分配三重指针的数组非常麻烦:

  1. buf = (char***)malloc(sizeof(char**) * l_counts); 这样你就有了l_counts长度的一个指针数组,数组元素是(char**)型的。

  2. 对上面的每一个buf[i],你buf[i] = (char**)malloc(sizeof(char*) *r_counts); 这样你的每个buf[i]都指向了一个r_counts长度的指针数组,数组元素是(char*)型的。

  3. 对于每一个buf[i] [j] = (char*)malloc(sizeof(char)); 这样你的每个buf[i] [j] 都指向了一个1字节字符。

  4. 当用完了后要反方向一个一个地释放分配的内存,即先释放所有buf[i] [j] ,再buf[i],再buf 

  5. 这样分配的内存要大于length*l_counts*r_counts,且不能保证数据是连续的(即*buf[i] [j] 在连续地址上)。


其实,用个一维数组要简单得多了。

buf = (char*) malloc(sizeof(char)*length*l_counts*r_counts);

原先的*buf[i][j]就是现在的 buf[i*length*r_counts + j*length];  (其中0<= i <l_counts, 0<= j < r_counts)

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式