因此,当前我正在尝试打印包含一些未初始化的浮点值的浮点数组(float *)。不知何故,它在我的控制台中显示了这样的值(使用“%d:%f \ n”作为格式):
-0.000000
0.000000
68509253839697691852885035134612406272.000000
0.000000
-0.000000
0.000000
这对我来说毫无意义。浮动怎么这么长? 同样,在一种非常类似的情况下,即我使用格式为“%5.1f”的sprintf来“ toString”一个矩阵,我的程序被中止(“第11行:1294中止陷阱:6”):
void mat_print(char * buf, matptr_t mat) {
char numbuf[10] = {0};
strcpy(buf, "");
for(uint32_t y = 0, ystop = mat->h; y < ystop; y++) {
strcat(buf, y == 0? "[ " : "\n[ ");
for(uint32_t x = 0, xstop = mat->w; x < xstop; x++) {
// on x = 2, i get an abort
sprintf(numbuf, "% 5.1f ", mat_get(mat, y, x));
strcat(buf, numbuf);
}
strcat(buf, "]");
}
}
在这里,我试图从矩阵对象获取值
struct matrix {
uint32_t h, w;
float * matrix;
};
typedef struct matrix * matptr_t;
具有一个名为mat_get
的函数inline float mat_get(matptr_t mat, uint32_t y, uint32_t x) {
return mat->matrix [y * mat->w + x];
}
矩阵浮点指针数组指向矩阵本身旁边的已分配区域,其所有内容均一口气分配:
matptr_t matrix(uint32_t h, uint32_t w) {
// nn_allocator is a function pointer to malloc
matptr_t mat = (matptr_t) nn_allocator(sizeof(struct matrix) + h * w * sizeof(float));
mat->h = h;
mat->w = w;
mat->matrix = (void *)mat + sizeof(struct matrix);
return mat;
}
大型浮子上印有:
// matptr is a pointer to a matrix object
float * values = (matptr)->matrix;
for(uint32_t i = 0, stop = (matptr)->w * (matptr)->h; i < stop; i++, values++) {
printf("%d: %f\n", i, *values);
}
所以问题是:如何修复此代码,使其不再中止我的程序?为什么浮动时间这么长?
在此先感谢您的帮助。