方法里面有一行代碼類似于:
static char data[] = "123456789";
我想用一百萬個字符而不是九個字符來填充上述資料陣列。但由于輸入它很乏味,我想在 for 回圈中這樣做。
是否可以將其保持為“靜態字符資料 []”?
編輯:
static char data[1000000];
for(int i=0; i<1000000; i )
{
data[i] = 1;
}
uj5u.com熱心網友回復:
在 C 中有多種方法可以實作這一點:
您可以將全域靜態陣列宣告為未初始化,撰寫一個初始化函式并在程式開始時呼叫該函式。與 C 不同,C 沒有在程式啟動時呼叫此類初始化函式的標準方法,但一些編譯器可能會為此提供擴展。
static char data[1000000]; void init_data(void) { //the loop below will generate the same code as //memset(data, 1, sizeof data); for (int i = 0; i < 1000000; i ) { data[i] = 1; } } int main() { init_data(); ... }您可以更改程式邏輯,以便可以將陣列初始化為
0而不是1. 這將消除對初始化函式的需求,并可能簡化代碼并減少可執行檔案的大小。您可以使用外部程式為陣列創建初始化程式并包含其輸出:
static char data[1000000] = { #include "init_data.def" };您可以使用宏初始化陣列
#define X10(s) s,s,s,s,s,s,s,s,s,s #define X100(s) X10(s),X10(s),X10(s),X10(s),X10(s),X10(s),X10(s),X10(s),X10(s),X10(s) #define X1000(s) X100(s),X100(s),X100(s),X100(s),X100(s),X100(s),X100(s),X100(s),X100(s),X100(s) #define X10000(s) X1000(s),X1000(s),X1000(s),X1000(s),X1000(s),X1000(s),X1000(s),X1000(s),X1000(s),X1000(s) #define X100000(s) X10000(s),X10000(s),X10000(s),X10000(s),X10000(s),X10000(s),X10000(s),X10000(s),X10000(s),X10000(s) static char data[1000000] = { X100000(1), X100000(1), X100000(1), X100000(1), X100000(1), X100000(1), X100000(1), X100000(1), X100000(1), X100000(1), };
但是請注意,這種方法將是對您的編譯器和代碼讀者的壓力測驗。以下是一些時間安排:
clang: 1.867s
gcc: 5.575s
tcc: 0.690s
最后 2 個解決方案允許data將其定義為常量物件。
uj5u.com熱心網友回復:
是否可以將其保持為“靜態字符資料 []”?
不,您必須明確指定大小。如果您希望在編譯時初始化陣列,而不是在運行時使用for回圈或分配給它memset,您可以使用諸如this之類的技巧。
另一種選擇可能是使用動態分配malloc代替,但是您必須在運行時分配所有內容。
uj5u.com熱心網友回復:
static您可以通過各種方式定義靜態分配的陣列,順便說一下,這與關鍵字無關,如果您需要有關變數的更多資訊,請參閱this 。static以下討論與此無關,因此為簡單起見,我將省略您的static關鍵字。
宣告為的陣列:
char data[] = "123456789";
在編譯時分配在堆疊中。編譯器可以做到這一點,因為陣列的大小是隱式給出的,字串"123456789"為 10 個字符,資料為 9,終止空字符為 1。
char data[];
另一方面,不會編譯,并且您的編譯器會抱怨缺少陣列大小。正如我所說,由于此宣告在編譯時分配陣列,您的編譯器想知道要分配多少。
char data[1000000];
另一方面,這將編譯得很好。因為現在編譯器知道要分配多少。您可以像在 for 回圈中那樣分配元素:
for(int i=0; i<1000000; i )
{
data[i] = 1;
}
注意:
百萬chars 的陣列具有相當可觀的大小,通常為 1Mb,并且可能會溢位您的堆疊。它是否真的將取決于它可以依賴的幾乎所有東西,但即使你的代碼運行良好,它肯定會引起一些人的注意。最終,如果你不斷增加大小,你最終會溢位緩沖區。
如果您有真正需要使用的大型陣列,您可以將它們分配在堆上,即,在您的 ram 的廢棄空海中。
希望上面的部分應該回答了你的問題。下面只是將固定值(例如 (1))分配給 char 陣列的替代方法,而不是使用for回圈。這只不過是一種更方便的方式(也許是一種更好的做法),如果它引起混淆,您可以隨意忽略它。
#include <string.h>
#define SIZE 100000
// Create the array, at this point filled with garbage.
static char data[SIZE];
int main( void )
{
// Initialise the array: assigns *integer 1* to each element.
memset( data, 1, sizeof data )
//^___ This single line is equivalent of:
// for ( int i = 0; i < SIZE; i )
// {
// data[i] = 1;
// }
.
.
.
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/436815.html
下一篇:在php中獲取關聯陣列的最高價格
