我有以下函数来设置结构并从结构中转储一些数据:
#include <stdio.h>
#include <stdlib.h>
#include "image.h"
// typedef from image.h included above, copied here for SO
typedef struct image {
int width;
int height;
char *data;
} image;
image *image_new(int width, int height) {
image *i = malloc(sizeof(image));
i->width = width;
i->height = height;
// allocate space for each row
i->data = malloc(sizeof(unsigned char) * height * width * 3);
return i;
}
void image_dump_data(image *i) {
for (int x = 0; x < i->width; x++) {
for (int y = 0; y < i->height; y++) {
// write pixel color to file
unsigned char r = i->data[(y * i->width) + (x * 3) + 0];
unsigned char g = i->data[(y * i->width) + (x * 3) + 1];
unsigned char b = i->data[(y * i->width) + (x * 3) + 2];
printf("%d %d %d ", (int)r, (int)g, (int)b);
}
printf("n");
}
}
一旦进行第一次printf()
调用,我的代码就会失败,并显示消息malloc(): corrupted top size
。当我将printf()
更改为fprintf(stderr, ...)
时,我得到了预期的输出。当我使用fprintf(stdout, ...)
时,错误仍然存在,因此专门关于使用stdout
的一些事情似乎导致我的代码失败。
我希望在这里包含所有相关信息,但如有必要,这里是指向 GitHub 存储库的链接,其中包含我在该项目中使用的所有文件。
我不小心利用了未定义的行为,该行为在打印到 stderr 而不是 stdout 时恰好有效(可能是因为缓冲输出与未缓冲输出(。在一个单独的文件中,我有一个结构指针大小的坏malloc,而不是结构本身,导致分配的内存太小。直到后来,这才立即表现出来。使用valgrind
进行调试时,以下行直接将我指向问题所在:
==1417933== Invalid write of size 8
==1417933== at 0x10A864: scene_new (scene.c:24)
==1417933== by 0x109267: main (raytracer.c:27)
==1417933== Address 0x4b8b160 is 0 bytes after a block of size 32 alloc'd
==1417933== at 0x483977F: malloc (vg_replace_malloc.c:309)
==1417933== by 0x10A823: scene_new (scene.c:23)
==1417933== by 0x109267: main (raytracer.c:27)
您是否尝试过更改格式以避免演员表?不确定它是否有帮助,但您可以尝试 printf 文档。
printf("%hhu %hhu %hhu ", r, g, b);