使用malloc填充的数组假定分配的内存少于所需内存

时间:2017-07-13 21:49:21

标签: 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++)
        {
            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的理解,它不应该能够填充数组并且应该发生分段错误。

为什么我可以这样填充阵列?

感谢。

2 个答案:

答案 0 :(得分:4)

您的代码

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个浮点值序列分配空间,则会编写malloc(36 * sizeof(float))。这样的结果将是指向此序列的第一个浮点值的指针,因此结果的类型为float *(BTW:与C ++相反,在C中,您不应该转换{{1 }})。请注意 - 为了获取一系列浮点值,您可以编写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*))

希望它有所帮助。

答案 1 :(得分:1)

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