的權分配內存的方式可能類似於
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',代表鍵盤(或終端,控制檯或任何你稱之爲的)。我猜你想知道「輸入」有多大,但是如果是這種情況,你實際上必須先閱讀它...... –