C++ &引用;“不可能”;最简单代码错误
我想跑,但我跑不动。也许它和指针有关, 我失去了期望C++ &引用;“不可能”;最简单代码错误,c++,compiler-errors,compilation,C++,Compiler Errors,Compilation,我想跑,但我跑不动。也许它和指针有关, 我失去了期望 #include <iostream> using namespace std; float createMatrix( int N ) { int i,j; float **matrix; matrix = new float*[N]; if (matrix == NULL) { free(matrix); return 0;
#include <iostream>
using namespace std;
float createMatrix( int N )
{
int i,j;
float **matrix;
matrix = new float*[N];
if (matrix == NULL)
{
free(matrix);
return 0;
}
for (i=0; i<N; i++)
matrix[i] = new float[N];
for(i=0; i<N;i++)
for(j=0; j<N;j++)
matrix[i][j] = rand();
return **matrix;
}
void printMatrix (float **matrix)
{
int N = sizeof(matrix)/sizeof(float);
for(int i=0; i<N;i++)
{
for(int j=0; j<N;j++)
std::cout << (matrix)[i][j];
std:: cout << std::endl;
}
}
int main(int argc, const char * argv[]) {
int N=0;
std::cout << "Hello! Please, write any number for a size of the matrix\n";
std::cin >> N;
float m = createMatrix(N);
printMatrix(m); // error
return 0;
}
#包括
使用名称空间std;
浮点创建矩阵(整数N)
{
int i,j;
浮点**矩阵;
矩阵=新浮点数*[N];
if(矩阵==NULL)
{
自由(矩阵);
返回0;
}
对于(i=0;i你必须从这个函数返回一个指向float的指针。但是你现在只返回第一个值
float** createMatrix( int N )
{
int i,j;
float **matrix;
matrix = new float*[N];
if (matrix == NULL)
{
free(matrix);
return 0;
}
for (i=0; i<N; i++)
matrix[i] = new float[N];
for(i=0; i<N;i++)
for(j=0; j<N;j++)
matrix[i][j] = rand() % 5; // not just rand(), in this case you become numbers in range [0, max int)
return matrix;
}
float **m = createMatrix(N);
下一行将始终为1。这是因为matrix
是一个指针,所有指针的大小都为4字节。因此,您有4/8==1
int N = sizeof(matrix)/sizeof(float);
对于原始dyn阵列,我们需要将大小作为参数传递
void printMatrix(float **matrix, int N) { /* do work */ }
最后你调用这个函数
printMatrix(m, N);
<>但是在C++中,你应该使用<代码> STD < /Cord>,不关心所有这些指针,看起来很糟糕。<代码> STD::向量< /代码>对我们有用。
编辑1:
正如注释中所更正的,并非所有指针都有4字节大小。在64位系统中,它有8字节大小
编辑2:
我们不应忘记释放内存:
for (int i = 0; i < N; ++i) {
delete m[i];
}
delete[] m;
for(int i=0;i
printMatrix
需要float**
但是除了float createMatrix(int N)
内存泄漏之外,您还传递了float
内存泄漏(并创建一个float
而不是float
矩阵)。为什么printMatrix
会将指针指向指针?您想做什么?您传递一个float
并期望一个**float!!
new float*[N]
从不返回null,如果返回null,则free(nullptr)
无效。@ascheplerfree(nullptr)
是无效的否。如前所述:如果ptr是空指针,则函数不执行任何操作。\这是因为矩阵是指针,并且所有指针的大小都为4字节。\不正确。64位系统上指针的大小是多少?@AlgirdasPreidžius您是对的。指针也可以是8字节。但并不总是8字节。谢谢您的更正.free(matrix)
应该是delete[]matrix
@Barmar不仅delete[]m;
而且for(int i=0;i