我试图在课堂上做一些顽皮的事情并且遇到了我无法解决的崩溃。我认为这是因为尝试读取未分配的数据,即使我认为应该分配和填充数据。帮助..?
void read(int &n, int &m, double ** arr){
fstream f1;
f1.open("1.txt"); //open a file to read the data from it
f1>>n>>m;
arr = new double *[n];//create an array of pointers (double)
for(int e = 0; e<n; e++){
arr[e] = new double[m]; //assign arrays of doubles to each pointer in the array
for(int l = 0; l < m; l++){
arr[e][l]= 0.f; //set it to 0
}
}
for(int e = 0; e<n; e++){
for(int s = 0; s<m; s++){
f1>>arr[e][s]; //read it from file
}
}
f1.close();
cout<<arr[3][4]<<"\n"; //prints out fine (the last number in my test matrix)
}
int main(){
double ** matrix;
read(n, m, matrix); //fills the matrix
cout<<matrix[0][0]; //crashes the program
return 0;
}
答案 0 :(得分:0)
您在arr
中为read
分配内存,但尝试在main
中使用它。如果您想将arr用作out参数(例如n
或m
),则应将其作为参考。
答案 1 :(得分:0)
您正在发送matrix
作为参数,它正按值复制到arr
。然后在read()
内存中分配并完成处理。当read()
结束时,它只会破坏arr
指针,即完全不是matrix
的指针,现在我们回到main()
并且matrix
仍未分配(调试模式下的nullptr
)。将arr
从read()
返回main()
并将其存储在matrix
中。在这种情况下,read()
的返回类型应为double**
。不要忘记在delete
中正确使用main()
矩阵。
修改强>
指针在RAM中有物理内存。 matrix
有自己的物理内存,称之为0xAAAA,arr
在RAM中有自己的内存,称之为0xBBBB。当matrix
传递给read()
时,会在RAM中创建一个与matrix
不同的新双指针,在您的情况下,arr
会知道这个新指针。要确认,请使用cout << &matrix;
和cout << &arr;
,您会看到它们位于两个不同的位置。现在,当read()
被调用时,matrix
的内容会在创建后复制到arr
。在调用read()
时,matrix
为空,即指向0x0000位置,内容复制意味着现在arr
指向相同的位置,即0x0000或null。使用cout << matrix;
和cout << arr
进行确认,结果将相同。现在为arr
分配新内存。 matrix
不知道这个内存,它仍然指向0x0000。当read()
结束时,arr
会被销毁,但<{1}}的内容会被销毁。使用arr
关键字分配的内存现在由无指针指向。当new
结束后控件返回main()
时,read()
仍然指向0x0000。您想要访问它并获得错误。现在必须有一种方法可以将matrix
指向由matrix
分配的内存,否则它将是内存泄漏。有很多种方法,其中一种方法是返回arr
main()arr, other is to allocate memory in
read(), process using
read()`ends的内容。