【问题标题】:C - Problems stepping through a struct pointerC - 遍历结构指针的问题
【发布时间】:2013-09-12 11:41:46
【问题描述】:

这是相当基本的,我可能遗漏了一些非常明显的东西,但这让我有点难过。基本上,假设我正在尝试将整个 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++”,第一个像素似乎没有问题地转换为红色。但是,当我把它放回去时,没有一个像素是红色的(甚至不是第一个)。

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

再次感谢,

奥斯汀

【问题讨论】:

    标签: c pointers struct pixel ppm


    【解决方案1】:

    我认为问题在于您没有存储已分配的缓冲区指针的初始值。您在循环中递增指针,因此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++;}
    

    【讨论】:

    • 这听起来不错。由于您很可能将buffer 发送到ppm_writeppm,因此您只发送了最后一个像素,因此为什么您只会得到 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);
    

    所以,试试这个。

    【讨论】:

      猜你喜欢
      • 2021-03-19
      • 2023-02-13
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多