![](/img/trans.png)
[英]Why is array of chars printing one less char than needed after dynamically allocating memory with 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.