如何用值初始化结构数组? 所以,我有带 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/