求大神帮我解答C++代码问题
#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就会崩溃,因为这段动态申请空间的代码也是抄来的,求大神给我讲一下为什么要这么申请空间以及怎么释放,还有没有其他申请空间的办法以及如何释放,求各位大神帮忙啊~!! 展开
buf = (char***)malloc(sizeof(char**) * numberofpointer );
由于分配buf的时候就不对,所以后面的buf[i]=malloc都是越界操作,内存乱了。
大神,我再问一下接下来的申请空间是为什么,,下面两步的空间申请我也不是很明白~~
没细看你的程序,但是分配三重指针的数组非常麻烦:
buf = (char***)malloc(sizeof(char**) * l_counts); 这样你就有了l_counts长度的一个指针数组,数组元素是(char**)型的。
对上面的每一个buf[i],你buf[i] = (char**)malloc(sizeof(char*) *r_counts); 这样你的每个buf[i]都指向了一个r_counts长度的指针数组,数组元素是(char*)型的。
对于每一个buf[i] [j] = (char*)malloc(sizeof(char)); 这样你的每个buf[i] [j] 都指向了一个1字节字符。
当用完了后要反方向一个一个地释放分配的内存,即先释放所有buf[i] [j] ,再buf[i],再buf
这样分配的内存要大于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)