c - 使用 memset 初始化三值结构数组

标签 c arrays opengl memory memset

如何用值初始化结构数组? 所以,我有带 rgb 值的结构颜色。

struct color{
    GLfloat r;
    GLfloat g;
    GLfloat b;
}

并尝试用 1.0f 初始化它。

color* cArray = (color*) malloc(w*h*sizeof(color));
memset(&cArray, 1.0, sizeof color);

但是我在 cArray[0] 上遇到了段错误,而不是正确的工作。 我想念什么?

最佳答案

注意:不要将 void *(malloc() 的结果)转换为其他指针,始终检查 malloc()< 的结果& friend

Memset 采用无符号字符(最有可能是 8 位)并将传递的区域视为字符数组。它不知道结构、数组等。只是 char 的一维数组。 (正如@chqrlie 指出的那样,memset() 实际上采用了一个int;然而,这在内部转换为unsigned char)。

段错误是因为您传递了 cArray 的地址,它是指向实际数组的指针,而不是它的值,它是数组本身。

对于 float ,memset() 很可能只有将其设置为 all-0 才有意义:

memset(cArray, 0, sizeof(struct color) * w * h);

注意:memset 不知道数据类型。它只需要一个指向内存块的指针和一个计数,并将值存储到该区域。 有责任确保所有论点都有效!

注意用0写入内存区域实际上是浮零(0.0,实际上是+0.0),因为它已经清除了所有位.这是为 float 设计编码的人的绝妙意图。

正如您之前分配的那样,您可以使用 calloc() 将其合并。这将分配和清除数组的内存区域。但是,如果您无论如何都打算显式设置所有值,则最好坚持使用 malloc()

如果要设置其他浮点值,则必须自己编写循环。但是,您可以为此将数组威胁为一维。

for ( size_t i = 0 ; i < w * h ; i++ )
    cArray[i] = (struct color){ .r = 1.0, .g = 1.0, .b = 1.0 };

它使用了一个复合文字。或者,您也可以单独设置字段。

如果您追求速度,那么组件文字方法可能是最快的。这样,编译器就可以很好地将所有值加载到三个寄存器中,并使用多存储将它们直接存储到内存中。不管它可能做什么,我敢打赌编译器会识别该模式并进行优化,因为它通常用于非常大的循环。

关于c - 使用 memset 初始化三值结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30675915/

相关文章:

c - 获取用户输入并使用函数检查其是否有效

c - 非阻塞套接字接收

javascript - 如何使用对象点键和数组点图进行迭代以显示组件中的数据?

c - 根据C中的字符串调整整数数组

c++ - 如何设置 NupenGL 并将其包含在 Visual Studio 项目中

c - 统一的安静输出?

c - 如何连接结构节点(链表)?

arrays - 创建具有相同前缀+顺序索引的 char 类型元胞数组的更简单代码?

opengl - 在Mac OS X上编译OpenGL SOIL

opengl - 为什么 POT 和 NPOT 纹理的 GL_CLAMP_TO_EDGE 不同?