繁体   English   中英

据说用malloc填充的数组分配的内存比需要的少

[英]Array filling with malloc supposedly allocating less memory than needed

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

这是我正在使用的代码:

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 *)malloc(36 * sizeof(float *))代替,则下面的代码可以很好地运行; 我把(float *)malloc(35 * sizeof(float *));

但是,如果我使用34,则不会发生这种情况。

我还检查了以下代码是否有效,实际上可以将所有3改为4,但是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的了解来看,它应该无法填充数组,并且应该发生分段错误。

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

谢谢。

您的密码

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

仅为一个指针保留空间,但分配了36个指针,因此超出了数组范围,并产生未定义的行为(崩溃,“有趣”输出,...)。

通常,您在代码中混合了指向浮点语义的指针(例如, matriz2= (float**) malloc (sizeof(float**))应该是matriz2= (float**) malloc (36*sizeof(float*)) )。

让我们从一个维度开始。 如果为36个float值序列分配空间,则将编写malloc(36 * sizeof(float)) 其结果将是指向该序列的第一个float值的指针,因此结果的类型为float * (BTW:与C ++相反,在C中,您不应该转换malloc的结果)。 请注意,要获取浮点值序列,请编写36 * sizeof(float) ,而不是36 * sizeof(float*) ,这将是一系列指向浮点的指针。 因此,单个维度的分配如下:

float *row = malloc(36 * sizeof(float));

如果现在有一系列这样的行(每个类型都具有float * ),则需要为一系列此类指针分配空间,即malloc (36 * sizeof(float*)) ,结果是指向第一个指针的指针此指针序列的指针。 因此,结果类型为float**

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
}

希望能帮助到你。

您的初始malloc太小(35次:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM