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)
无效。@aschepler
free(nullptr)
是无效的否。如前所述:如果ptr是空指针,则函数不执行任何操作。\这是因为矩阵是
指针,并且所有指针的大小都为4字节。\不正确。64位系统上指针的大小是多少?@AlgirdasPreidžius您是对的。指针也可以是8字节。但并不总是8字节。谢谢您的更正.
free(matrix)
应该是
delete[]matrix
@Barmar不仅
delete[]m;
而且
for(int i=0;i