的权分配内存的方式可能类似于
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中,施放malloc
的结果被认为是不好的做法。这是不必要的,因为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
等
1.与C++相反,如果需要,但如果您要编写C++,则无论如何您都应该使用new
运算符。是的,你会看到成千上万个包含演员的例子。您还将看到数千个使用void main()
的示例。大多数C参考只是垃圾。
这根本没有任何意义。或者你想从'stdin'获得一些输入吗?然后你必须用例如'scanf'。并且转换为'int *',为什么要这样做?你不想要一个像素结构的“数组”吗? –
你为什么通过'stdin'?而且,编译器正在做你告诉它做的事情,而不是你期望它做的事情。 –
你预计在这种情况下'stdin'会给你什么?它是一个'FILE',代表键盘(或终端,控制台或任何你称之为的)。我猜你想知道“输入”有多大,但是如果是这种情况,你实际上必须先阅读它...... –