首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于内存的有关问题 有些晕

2012-11-03 
关于内存的问题有些晕#includeiostream.h#includeostream.h#includeistream.h//using namespace std

关于内存的问题 有些晕
#include<iostream.h>
#include<ostream.h>
#include<istream.h>
//using namespace std;
typedef int **MAX;//为现有类型创建一个新的名字,或称为类型别名
class Matrix
{
int row;//行
int line;//列
MAX max;
public:
Matrix(int line, int row);//建立矩阵
Matrix();
void init();
void display();
void inputDate();
  friend Matrix operator+ (Matrix &m1 , Matrix &m2);

};
void Matrix::init()
{
  for(int i = 0; i < line; i++) 
for(int j = 0; j < row; j++)
max[i][j] = 0;
}
Matrix::Matrix()
{
  row = 10;
  line = 10;
  max=(int **)new int[line];
for(int i=0;i<line;i++)
{
max[i]=new int[row]; 
}
init();
}
Matrix::Matrix(int row, int line)
{
this->row = row;
  this->line = line;
max = (int **) new int[row];
for(int i = 0; i < row; i++)
{
max[i] = new int[line];
}
init();
}
void Matrix::display()
{
  for(int i = 0; i < row; i++) 
  {
for(int j = 0; j < line; j++)
{
cout<<max[i][j]<<" ";
}
cout<<endl;
  }
}
Matrix operator+ (Matrix &m1 , Matrix &m2)
{
  for(int i = 0; i < m1.line; i++) 
for(int j = 0; j < m1.row; j++)
m1.max[i][j] += m2.max[i][j];
return m1;
}
void Matrix::inputDate()
{
  cout<<"请输入数据:"<<endl;
  for(int i = 0; i < row; i++)
{
cout<<"请输入第"<<i+1<<"行数据"<<endl;
for(int j = 0; j < line; j++)
{
cin>>max[i][j];
}

  }
}
int main()
{
  Matrix m(4,3);
  m.inputDate();
  m.display();
}
有个地方十分不理解

这样子max = (int **) new int[row];
for(int i = 0; i < row; i++)
{
max[i] = new int[line];
}
正确
但是我改为
max = (int **) new int[line];
for(int i = 0; i < line; i++)
{
max[i] = new int[row];
}
就错误 编译正确 但是我输入数据后 最后就会错误

[解决办法]
char**p = a;
就是 p=a,p[0] = malloc(5)就是 *(a+0)= malloc(5) ,所以报错
[解决办法]

探讨
char *a[4] = {"this","is","a","test"};

char**p = a;

在分配内存的时候,你应该这么分配:

p[0] = malloc(5)

p[1] = malloc(3)

[解决办法]
探讨

引用:
char *a[4] = {"this","is","a","test"};

char**p = a;

在分配内存的时候,你应该这么分配:

p[0] = malloc(5)

p[1] = malloc(3)
这样做没有什么错误 你是误导
C/C++ code
p[0] = malloc(5)

p[1] = malloc(3)
//在这里……


[解决办法]
仅供参考
C/C++ code
//在堆中开辟一个4×5的二维int数组#include <stdio.h>#include <malloc.h>int **p;int i,j;void main() {    p=(int **)malloc(4*sizeof(int *));    if (NULL==p) return;    for (i=0;i<4;i++) {        p[i]=(int *)malloc(5*sizeof(int));        if (NULL==p[i]) return;    }    for (i=0;i<4;i++) {        for (j=0;j<5;j++) {            p[i][j]=i*5+j;        }    }    for (i=0;i<4;i++) {        for (j=0;j<5;j++) {            printf(" %2d",p[i][j]);        }        printf("\n");    }    for (i=0;i<4;i++) {        free(p[i]);    }    free(p);}//  0  1  2  3  4//  5  6  7  8  9// 10 11 12 13 14// 15 16 17 18 19 


[解决办法]

探讨
引用:

因为new int[row]运行时候,输入数据,为导致堆错误。

举个例子。

char *a[4] = {"this","is","a","test"};

char**p = a;

在分配内存的时候,你应该这么分配:

p[0] = malloc(5)

p[1] = malloc(3)

。。。。。

你的错误同理。
前一个分……

[解决办法]
再供参考
C/C++ code
//在堆中开辟一个3×4×5的3维int数组#include <stdio.h>#include <malloc.h>int ***p;int i,j,k;void main() {    p=(int ***)malloc(3*sizeof(int **));    if (NULL==p) return;    for (i=0;i<3;i++) {        p[i]=(int **)malloc(4*sizeof(int *));        if (NULL==p[i]) return;        for (j=0;j<4;j++) {            p[i][j]=(int *)malloc(5*sizeof(int));            if (NULL==p[i][j]) return;        }    }    for (i=0;i<3;i++) {        for (j=0;j<4;j++) {            for (k=0;k<5;k++) {                p[i][j][k]=i*20+j*5+k;            }        }    }    for (i=0;i<3;i++) {        for (j=0;j<4;j++) {            for (k=0;k<5;k++) {                printf(" %2d",p[i][j][k]);            }            printf("\n");        }        printf("---------------\n");    }    for (i=0;i<3;i++) {        for (j=0;j<4;j++) {            free(p[i][j]);        }        free(p[i]);    }    free(p);}//  0  1  2  3  4//  5  6  7  8  9// 10 11 12 13 14// 15 16 17 18 19//---------------// 20 21 22 23 24// 25 26 27 28 29// 30 31 32 33 34// 35 36 37 38 39//---------------// 40 41 42 43 44// 45 46 47 48 49// 50 51 52 53 54// 55 56 57 58 59//--------------- 

热点排行