用malloc填充数组可能分配的内存比需要的内存少

用malloc填充数组可能分配的内存比需要的内存少,c,arrays,pointers,C,Arrays,Pointers,我想知道我为什么会有这种行为: 这是我正在使用的代码: matriz2= (float**) malloc (sizeof(float**)); for (int m=0;m<36;m++) { matriz2[m]=(float *) malloc(36*sizeof(float*)); } for (int k=0;k<36;k++) { for (int l=0;l<36;l++) { matri

我想知道我为什么会有这种行为:

这是我正在使用的代码:

matriz2= (float**) malloc (sizeof(float**));
    for (int m=0;m<36;m++)
{
    matriz2[m]=(float *) malloc(36*sizeof(float*));
}


for (int k=0;k<36;k++)
{
        for (int l=0;l<36;l++)
        {
            matriz2[k][l]=i;
            i++;
            printf("%f\n ",matriz2[k][l]);
        }
}   
我已经检查了一些关于malloc所做的内存分配的事情

如果matriz2[m]=float*malloc36*sizeoffloat*,则以下代码运行良好;我把浮球*malloc35*sizeoffloat*

但如果我用34岁就不会这样了

我还检查了以下代码是否有效,实际上它可以将所有3s更改为4s,但有5个代码失败:

matriz2= (float**) malloc (sizeof(float**));
    for (int m=0;m<3;m++)
{
    matriz2[m]=(float *) malloc(sizeof(float*));
}


for (int k=0;k<3;k++)
{
        for (int l=0;l<3;l++)
        {
            matriz2[k][l]=i;
            i++;
            printf("%f\n ",matriz2[k][l]);
        }
}   
虽然我从malloc那里了解到,它不应该能够填充数组,应该会发生分段错误

为什么我可以这样填充数组


谢谢。

您的初始malloc太小了35倍:

您的代码

matriz2= (float**) malloc (sizeof(float**));
for (int m=0;m<36;m++) {
    matriz2[m]=(float *) malloc(36*sizeof(float*));
}
如果现在有一个这样的行序列,每个行的类型都是float*,则需要为这样的指针序列分配空间,即malloc 36*sizeoffloat*,结果是指向该指针序列的第一个指针的指针。因此,结果类型为float**:

然后,您可以为每行保留空间并为其分配:

float **matrix = malloc(36 * sizeof(float*))  // sequence of pointers to rows
for (int m=0;m<36;m++) {
    matrix[m]=malloc(36*sizeof(float));  // row, i.e. sequence of floats
}
希望有帮助。

matriz2=float**malloc sizeoffloat**;->matriz2=float**malloc 36*sizeoffloat*;,matriz2[m]=malloc36*sizeoffloat*;->matriz2[m]=malloc36*sizeoffloat;
float **matrix = malloc(36 * sizeof(float*))
float **matrix = malloc(36 * sizeof(float*))  // sequence of pointers to rows
for (int m=0;m<36;m++) {
    matrix[m]=malloc(36*sizeof(float));  // row, i.e. sequence of floats
}