将RGB值存储在动态多维数组中

时间:2016-01-18 17:18:15

标签: c

所以我想知道如何在C中的数组/多维数组中存储多个RGB值,我不知道有多少个。

我听说过 malloc ,但我还不确定如何在多维数组上使用它。

E.g。我有 n rgb值:

array[n][3] = {
    array[i] = {ri, gi, bi}, etc...
}

谢谢!

3 个答案:

答案 0 :(得分:3)

您不需要多维数组来存储RGB值。只需声明一个包含3 int的结构,并动态分配一个结构数组来存储值。 / p>

#include <stdio.h>
#include <stdlib.h>

struct RGB {
    unsigned char R;
    unsigned char G;
    unsigned char B;
};

int main(void)
{
    //allocate dynamically array of 10 RGB struct's
    struct RGB *rgb = malloc(10*sizeof(struct RGB));
    //white color
    rgb[0].R = 255;
    rgb[0].G = 255;
    rgb[0].B = 255;

    //black color
    rgb[1].R = 0;
    rgb[1].G = 0;
    rgb[1].B = 0;
    /*.............*/
    printf("the R G B of the white color is %d %d %d\n",rgb[0].R,rgb[0].G,rgb[0].B);
    printf("the R G B of the black color is %d %d %d\n",rgb[1].R,rgb[1].G,rgb[1].B);
    //free dynamically allocated memory
    free(rgb);
    return 0;
}

答案 1 :(得分:0)

请使用:

/* N is the number of rows . N here is 3 */

if (( n = malloc( 3*sizeof( int* ))) == NULL )

{ /* error */ }

for ( i = 0; i < 3; i++ )

{
if (( c[i] = malloc( sizeof(int))) == NULL )
{ /* error */ }

/* probably init the row here */
}

/* access matrix elements: n[i] give you a pointer
 * to the row array, n[i][j] indexes an element
*/
n[i][j] = 12;

正如其他人用结构更容易实现RGB一样:

struct RGB_t {
    char BLUE;/* I have heared each color is from 0 to 255 */
    char RED;
    char GREEN;
}

typedef struct RGB_t RGB;

答案 2 :(得分:0)

如果您想要一个在编译时未知的大小数组,那么您想要动态分配内存是正确的。

在这种情况下,您实际上会使用指针而不是数组。尽管指针和数组在c中实际上并不完全相同,但为了简单起见,它们的行为方式非常相似。

malloc需要Stdlib

#include <stdlib.h>

这样的情况也可以创建一个结构来处理一组颜色更简单(假设你的颜色是1字节值,所以我们使用char - 如果它们可能大于255,你会需要使用更大的类型:

typedef struct color_t {
    unsigned char r;
    unsigned char g;
    unsigned char b;
} color;

然后你可以按如下方式分配内存:

int n = 200; //However many there are, you will need to know this before allocating memory
color* colors = (color*) malloc(sizeof(color)*n);

Malloc将保留所要求的字节数,并返回指向内存开头的指针。因此,您使用sizeof()来获取颜色结构的字节大小,然后将其乘以您需要的值。

然后,您可以使用

在内存中寻址结构
int i = 20; //Where i is the particular color you want to access
colors[i].r = 0;
colors[i].g = 0;
colors[i].b = 0;

完成内存后,您需要使用

释放它
free(colors);

如果你不这样做,程序将继续使用这个内存,即使你不再有实际的颜色变量 - 例如,如果它只存在于一个函数内。

如果你没有结构,那么分配就像这样:

unsigned char* colors = (unsigned char*) malloc(sizeof(unsigned char)*n*3);

然后访问看起来像这样,因为每次都会跳过内存中的3个变量:

colors[i*3] = 0;
colors[i*3+1] = 0;
colors[i*3+2] = 0;