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

标签 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?
}   

最佳答案

好吧,内存分配可能没有按照您指定的方式进行:

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循环。


For the ..., what if I have the pixels in a char array? How can I step through it and copy into the pixels?

您可以通过两种方式中的任何一种来完成。假设像素数组在 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];
}

只需确保蓝、绿、红顺序正确即可。

关于为结构分配内存的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17713377/

相关文章:

c - GCC 是否为传递给函数的数组创建 typedef?

c# - 您如何通过 WiFi 或 LAN 网络在不同的机器上验证 Windows 用户凭据?

c - 将字符串存储到c中的数组中

c - 二进制文件有编码吗?使困惑

在 C 中计算 0's and 1' 的二维数组的高度

c - 静态变量和静态内存分配之间的区别?

c++ - C 中的运算符重载

c - stdio 过滤器在管道传输时崩溃

c - 如果我不在 switch case 中写 default 怎么办?

c - 将 memcpy 用于结构