分配内存的正确方法是
size_t elements = 0;
... // get the number of elements as a separate operation
pixel *buffer = malloc( sizeof *buffer * elements ); // note no cast,
// operand of sizeof
if ( buffer )
{
// load your buffer here
}
在 C 中,强制转换 of 的结果malloc
被认为是不好的做法1。这是不必要的,因为void *
可以将值分配给任何指针类型,并且在 C89 编译器下,如果您忘记包含stdlib.h
或没有malloc
范围内的声明,它可以抑制诊断。
此外,由于表达式*buffer
具有类型pixel
,因此表达式sizeof *buffer
等价于sizeof (pixel)
。如果类型发生变化,这可以为您节省一些维护时间buffer
。
如何获得数组的元素数量实际上取决于您的应用程序。最简单的方法是将该值粘贴在数据文件的开头:
size_t elements = 0;
FILE *data = fopen( "pixels.dat", "r" );
if ( !data )
{
// You will want to add real error handling here.
exit( 0 );
}
if ( fscanf( data, "%zu", &elements ) != 1 )
{
// You will want to add real error handling here
exit( 0 );
}
pixel *buffer = malloc( sizeof *buffer * elements );
if ( buffer )
{
for ( size_t i = 0; i < elements; i++ )
{
if ( fscanf( data, "%hhu %hhu %hhu", // %hhu for unsigned char
&buffer[i].r, &buffer[i].g, &buffer[i].b ) != 3 )
{
// more real error handling here
exit( 0 );
}
}
}
自然,这假设您的数据文件结构为 3 个整数值的行,例如
10 20 30
40 50 60
等等
new
1. 与需要 C++ 的地方相反,但如果您正在编写 C++,则无论如何都应该使用运算符。是的,你会看到数以千计的例子,其中包括演员表。您还将看到数千个使用void main()
. 大多数 C 引用都是废话。