[英]Syntax Error : '{'
我正在編寫一個使用整數數組的C程序,該數組是結構的一部分。 結構為:
struct test
{
int *ques;
int a;
int b;
int len; // len is the length of the array defined in the structure as ques.
};
在此聲明之后的函數中,我為len分配了一個值:
cases[0].len=5; // here cases is an array of the type struct test.
然后我已經使用malloc
分配內存以陣列構件ques
如下:
cases[0].ques=(int *)malloc(cases[counter].len*sizeof(int));
之后,我嘗試按如下所示填寫數組ques
:
cases[0].ques[5]={-7,-6,-5,-4,-3};
在編譯時,在上面的行中出現錯誤,指出:
maxmin.c(47) : error C2059: syntax error : '{'
你能幫我嗎?
這是無效的: cases[0].ques[5]={-7,-6,-5,-4,-3};
您只能在聲明數組時以這種方式用C初始化數組。
要在此時在C程序中填寫值,應使用for
循環分別填充每個索引。
現在,C編譯器將此語句解析為:
指數的值5
陣列的ques
在索引0
的結構陣列cases
類型的struct test
是{-7,-6,-5,-4,-3}
這當然是因為無效不能使用{
而將值分配給一個變量。
更新OP的評論:
您可以將所有值保留在temp數組中,例如: int temp[50] = {...};
然后在為ques
分配空間之后,可以使用memcpy
函數將len
個值復制到ques
。
如果您擁有C99或C11,則可以將復合文字與memcpy()
或memmove()
結合使用來初始化新數組:
memmove(&cases[0].ques, (int []){-7,-6,-5,-4,-3}, 5 * sizeof(int));
這也解決了您將cases[0].ques
分配為指向5個整數的指針的問題,但是隨后您嘗試分配給超出分配數組末尾的單個元素。 該代碼也不一致,因為其中大多數引用cases[0]
但是malloc()
調用引用了參數列表中的cases[count]
。 不會自動出錯,但是絕對不尋常。
數組文字可以根據需要任意大。 唯一棘手的問題是memmove()
的size參數(第三個參數memmove()
。 我很快就躲開了; 重復復合文字感覺不正確,但是手動計數也不是一個好的解決方案。
好吧,如果memmove()
不是反對接受7個參數而不是3個參數的宏(在Mac OS X 10.9.2上為GCC 4.8.2 memmove()
,您可以!
(memmove)(&cases[0].ques, (int []){-7,-6,-5,-4,-3}, 5 * sizeof(int));
memmove(&cases[0].ques, ((int []){-7,-6,-5,-4,-3}), 5 * sizeof(int));
第一個調用函數memmove()
,而不是宏。 第二個通過將括號括在復合文字上來創建單個參數。 兩者都編譯。
請注意,盡管復合文字看起來像是強制轉換和大括號初始化程序,但我不確定它嚴格來說是強制轉換-最好不要將其視為強制轉換,而應將其視為復合文字。
順便說一句,如果目標是將N個隨機值添加到N個整數的數組中(如對其他答案之一的評論中所述),則您將不希望使用此技術-示例中的整數不可信,因為隨機序列。 如果您確實希望在某個范圍內有50個隨機數,則可以使用一個隨機數生成器(可能是rand()
,可能是lrand48()
,還可能是其他東西)來創建一個適當范圍內的值,並使用簡單的for
循環進行初始化正確數量的數組元素。
為每個數組元素分配值,
cases[0].ques[0]=-7
cases[0].ques[1]=-6
...
cases[0].ques[5]=-3
因為您要在聲明后分配值。 C允許{}在聲明時用於初始化數組。 在那之后。
ques[5]
是一個int
,不能為其分配數組
同樣,C不允許這樣分配給數組中的多個元素。 您只能在初始化時執行此操作。 因此,創建一個新數組並使用這5個元素進行初始化,然后使用memcpy()
或memmove()
將其復制到目標位置
int[] tmp = {-7,-6,-5,-4,-3};
memcpy(cases[0].ques, tmp, 5*sizeof(int));
另外,您可以分別為ques[i]
分配值
希望您知道為什么cases[0].ques[5]
錯誤。
int arr[5] = {1,2,3,4,5};
上面的代碼有效,因為您正在聲明時對數組進行初始化。
如果你有
int arr[5];
arr[5] = {1,2,3,4,5}; // THIS WONT WORK
在這里,您必須使用for循環並填充每個索引。
還有,當你做
int arr[5];
arr[5] = {1,2,3,4,5};
在上面的代碼中,您想要做的是將一些值放在arr [5]中。 那只是整個數組的一個索引。
另外,正如注釋所建議的那樣, arr[5]
是大小為5的數組中的第6個元素。現在,盡管它不會出錯,但要准備得到一些意想不到的結果。 :)
cases[0].ques[5]={-7,-6,-5,-4,-3};
您無法執行此操作,此初始化程序僅在定義數組時有效。
您應該執行以下操作:
for (start = -7, i = 0; i < cases[0].len; i++, start++) {
cases[0].ques[i] = start;
}
很多時候我不使用C進行編程,但是我認為可以進行完整數組聲明的唯一情況是在聲明時:
int a[] = {...}
但不是這樣:
int a[5];
a = {...};
另外,就您而言,您正在
int a[5] = {...}
這意味着您正在嘗試將一個數組分配給一個整數。
另外,最好不要在malloc調用中進行強制轉換 :
cases[0].ques = malloc(cases[counter].len * sizeof(int));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.