为结构分配内存的正确方法?

时间:2013-07-18 02:12:57

标签: c

我正在尝试确定为从文件读取的动态像素数分配内存的最佳方法。我有头文件中像素数据的字节数。

我正在尝试以下方式,但我遗漏了一些东西。

typedef struct {
    unsigned char blue;
    unsigned char green;
    unsigned char red;
} pixel_t; 

for(i = 0; i <= ((bmp->dib.bmp_bytesz) / 3); i++) {
    // Something here?
}   

2 个答案:

答案 0 :(得分:2)

好吧,内存分配可能不会出现在您指定的位置:

pixel_t *pixels = malloc(((bmp->dib.bmp_bytesz/3)+1) * sizeof(*pixels));
if (pixels == 0)
    ...deal with out of memory error...

for (int i = 0; i <= bmp->dib.dmp_bytesz/3; i++)
{
    pixels[i].blue = ...;
    pixels[i].green = ...;
    pixels[i].red = ...;
}

+1允许<=循环中的for。小心检查<=是否正确;在<循环中使用for更为常见。


  

对于...,如果我在char数组中有像素怎么办?如何逐步完成并复制到像素中?

您可以通过以下两种方式之一进行操作。假设像素阵列在unsigned char *pixel_array;中,那么您可以使用:

unsigned char *p = pixel_array;

for (int i = 0; i <= bmp->dib.dmp_bytesz/3; i++)
{
    pixels[i].blue  = *p++;
    pixels[i].green = *p++;
    pixels[i].red   = *p++;
}

或:

for (int i = 0; i <= bmp->dib.dmp_bytesz/3; i++)
{
    pixels[i].blue  = pixel_array[i*3+0];
    pixels[i].green = pixel_array[i*3+1];
    pixels[i].red   = pixel_array[i*3+2];
}

确保你的蓝色,绿色,红色序列正确无误。

答案 1 :(得分:1)

在for循环中执行某些操作之前,需要为像素分配内存。

typedef struct {
    unsigned char blue;
    unsigned char green;
    unsigned char red;
} pixel_t; 
pixel_t *pixel = (pixel_t *)malloc(bmp->dib.bmp_bytesz);
if(pixel == NULL) { exit(-1); }

for(i = 0; i < ((bmp->dib.bmp_bytesz) / 3); i++) {
    // Something here?
    pixel[i].blue = bmp->dib[3 * i];
    pixel[i].green = bmp->dib[3 * i + 1];
    pixel[i].red = bmp->dib[3 * i + 2];
}