C - 逐步执行结构指针的问题

时间:2013-09-09 01:53:25

标签: c pointers struct pixel ppm

这是相当基本的,我可能会遗漏一些非常明显的东西,但这个让我有点难过。基本上,假设我试图将整个PPM图像变为红色(这实际上并不是我正在做的事情,但为了排除故障,我们将继续这样做)。我有一个结构,我用来存储像素值。

typedef struct pixel_type
{
   unsigned char r;
   unsigned char g;
   unsigned char b;
}  pixel_t;

我用来指向该结构的指针是“缓冲区”。

pixel_t *buffer;

我还分配了我需要的空间量(图像的宽度*图像的高度*像素值的数量[3])

buffer = malloc(WIDTH*HEIGHT*sizeof(pixel_t));

然后我有一个'for'循环,我用它来逐步通过缓冲区指针并将每个像素值转换为红色。

int i;
for (i=0;i<(WIDTH*HEIGHT);i++){
   buffer->r=255;
   buffer->g=0;
   buffer->b=0;
   buffer++;} //this part appears to be the problem

这里的问题是输出只是一个黑色图像,顶部有几个垃圾像素。我也尝试取出'buffer ++',并且第一个像素似乎转换为红色而没有任何问题。但是,当我把它重新放入时,没有像素是红色的(甚至不是第一个)。

我不确定我错过了什么。我知道当你创建一个指针时,你可以直接通过在末尾用'++'做指针(没有*取消引用)来逐步指向指针的下一个地址。然而,这似乎是个问题。有人能告诉我我做错了什么吗?

再次感谢,

奥斯汀

2 个答案:

答案 0 :(得分:3)

我认为问题在于您没有存储已分配的缓冲区指针的初始值。您可以在循环中递增指针,因此buffer指向循环结束后缓冲区的末尾。

在循环中使用不同的指针来解决此问题:

int i;
pixel_t *ptr;
for (i=0, ptr = buffer;i<(WIDTH*HEIGHT);i++){
   ptr->r=255;
   ptr->g=0;
   ptr->b=0;
   ptr++;}

答案 1 :(得分:2)

要实现的第一个概念是buffer是指向像素数组存储的指针。它是指向该存储的 ONLY 指针。如果代码修改了缓冲区,则不再容易访问该存储的启动。

其次,您希望将缓冲区设置为其原始值,以便可以反转malloc。因此,保留两个指针来访问像素数组。其中一个是“锚”,另一个是索引器:

   pixel_t  *buffer, *pix;

   buffer = malloc(WIDTH*HEIGHT*sizeof(pixel_t));

   for (pix = buffer; pix < buffer + (WIDTH*HEIGHT); pix++)
   {
     pix->r = 255;
     pix->g = 0;
     pix->b = 0;
   }

   // later in your code
   free(buffer);

所以,试试这个。