仅使用void指针探索内存

时间:2014-10-27 16:04:31

标签: c pointers pixel void

我从C语言开始(我通常使用Java或PHP),我的void *指针类型有问题。

在我的程序中,我从结构 f 中包含外部API的像素缓冲区。     (void *)f - > PIXBUF

该指针指向以BGR24编码的像素缓冲区。 3个字节对应一个像素(每种颜色1个字节)。

我想只保持1个八位字节(像素= 3个字节)。但我真的不知道该怎么做。我juste有所有这些八位字节的地址(f - > pixbuf)。是否可以通过逐个读取每个八位字节来填充char选项卡?

PS:f的大小 - > pixelbuf是5 292 000字节

3 个答案:

答案 0 :(得分:2)

要通过void - 指针访问特定数据类型,您需要将void指针强制转换为您要访问的类型的指针,char

struct pic
{
  void * pixbuf;
  size_t pixbuflen;
  ...
}

...

struct pic f = ...;
struct pic grey = {0};

grey->pixbuflen = f->pixbuflen/3;
grey->pixbuf = malloc(grey->pixbuflen); /* Allocate the target buffer begin sized a 
                                          3rd of the destination buffer. */
if (NULL == grey->pixbuf) /* Test for failure. */
{
   /* Failure to allocate the buffer. */
   grey->pixbuflen = 0;
   exit(1);
}

for (size_t i = 0, j = 0; i < grey->pixbuflen; ++i, j += 3)
{
  ((char *) grey->pixbuf)[i] = ((char *) f->pixbuf)[j]; /* Copy every 3rd byte from 
                                                           source to destination. */
}

如果可以确保指针指向有效内存,则可以将其索引为数组。

答案 1 :(得分:0)

typedef struct pixel
{
  char b;
  char g;
  char r;
}              pixel_t;

然后您可以访问任何想要的像素颜色:

pixel_t*  pixels = f->pixbuf;

pixels[42].r = 0x0F;
pixels[42].g = 0xA0;
pixels[42].b = 0xB4;

答案 2 :(得分:0)

你需要这样的东西:

int length =  f->pixbuflen;
unsigned char* sourcepixels = (unsigned char*)f->pixbuf;
unsigned char* destpixels = malloc(length / 3); // length being the number of
                                                // RGB pixels of the original image
for (int i = 0; i < length/3; i++)
  destpixels[i] = sourcepixels[i*3];

这是非优化的,未经测试的非错误检查代码。