【发布时间】:2015-12-13 14:57:31
【问题描述】:
我必须使用 3 维数组,因为我想将图片分成正方形并将每个正方形的 RGB 平均值存储在我的数组中。
我想要这个尺寸,tab[height][width][3],
所以我这样做了:
i = 0; j = 0; k = 0;
float*** tab;
tab = malloc((hauteur+1)*sizeof(float*));
while(i <= hauteur){
tab[i] = malloc((largeur+1)*sizeof(float**) );
i++;
}
i = 0;
while(i <= hauteur){
j = 0;
while (j <= largeur){
tab[i][j] = malloc(3*sizeof(float***));
j++;
}
i++;
}
但我在 :tab[1][30][2]; 之后出现了段错误。
我的malloc 有问题吗?
这很奇怪,因为当我声明 tab 时它不会出现段错误:
tab[hauteur][largeur][3].
(抱歉:“hauteur”在法语中的意思是“高度”,“largeur”的意思是“宽度”。)
(如果您认为需要检查我的整个函数:http://pastebin.com/eqQXz8Ad;它是 JPEG 文件的编写器。)
【问题讨论】:
-
请使用
for循环来保持我们的理智,如果不是为了你的!while循环将控制代码分散在 3 行中;for循环将其全部压缩到一行中。使用for循环避免麻烦要容易得多。 -
你正在初始化一些变量两次。所以也请考虑一下。
-
对于最里面的数组,需要分配
3 * sizeof(float);对于中间分配,你应该分配(largeur + 1) * sizeof(float *);对于最外层(单个)分配,您需要分配(hauteur + 1) * sizeof(float **)。碰巧的是,您不会在 32 位或 64 位机器上遇到问题——尽管您会为最里面的数组分配两倍所需的空间。我不确定你为什么在里面有+ 1,但这意味着你可以索引tab[hauteur][longeur][2]而不会出现下标错误。通常,您使用for (i = 0; i < hauteur; i++)(<而不是<=)。 -
除了@JonathanLeffler 所写的内容之外,如果您坚持始终引用分配给大小的指针的 malloc 最佳实践,则可以避免此错误。示例:
tab = malloc(count * sizeof(*tab));。*tab始终是正确的类型,无论它声明了多少间接。下一个是tab[i] = malloc(count * sizeof (*tab[i]));等。 -
使用合适的工具来完成这项工作。
for (i = 0; i < size; ++i) {...}。请注意,<不是<=。背诵这个模式,这样你就可以在凌晨 4 点 30 分在酒吧爬行后在一个陌生的地方醒来时背诵它。尝试向自己证明您确实需要<而不是<=,并探索如果您使用<=会发生什么。