我想知道为什么我会有这种行为:
这是我正在使用的代码:
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的理解,它不应该能够填充数组并且应该发生分段错误。
为什么我可以这样填充阵列?
感谢。
答案 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次:))