2014-04-10 318 views
0

我在寫一個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 : '{' 

你能幫我嗎?

+0

'cases [0] .ques [5] = { - 7,-6,-5,-4,-3};' - 你從哪裏得到這個想法是有效的C?即使是這樣,它也會試圖將5個值填入問題中[5] ......僅分配ques [0] ... ques [4]時。 –

+0

@JimBalter:我會說'ques'的大小是'cases [counter] .len',它可能是或不可能是'5'。 –

+0

一如既往:不要投射由'malloc'返回的指針。 –

回答

4

這是無效的:cases[0].ques[5]={-7,-6,-5,-4,-3};

您可以用C這樣,只有在數組聲明時初始化數組。

要在您的C程序中填入此處的值,您應該使用for循環來分別填充每個索引。

眼下的C編譯器解析這個聲明爲:數組ques指數5

值在結構數組的索引0struct test類型的cases{-7,-6,-5,-4,-3},這肯定是無效的,因爲你不能使用{而分配值給一個變量。

更新在OP的評論:

你也可以在臨時數組中的所有值說int temp[50] = {...};然後ques分配空間後,您可以使用memcpy功能len數量的值複製到ques

+0

謝謝先生。有沒有辦法來初始化一個有很多整數的數組,比如50?我必須靜態給出這些值,所以我不認爲我可以使用for循環。 – user3153983

+0

@ user3153983 MadHatter的更新提到了'memcpy',這是最明智的答案。如果你發現這個答案有幫助,你應該接受它。 –

3

將值分配給每個數組元素如,

cases[0].ques[0]=-7 
cases[0].ques[1]=-6 
... 
cases[0].ques[5]=-3 

因爲要分配聲明之後的值。 C允許用於在聲明時初始化數組。不是在那之後。

+0

謝謝先生/女士。有沒有辦法來初始化一個有很多整數的數組,比如50?我必須靜態給出這些值,所以我不認爲我可以使用for循環。上面提到的方法看起來很乏味。 – user3153983

+0

@ user3153983如何獲得這50個值?任何邏輯? – LearningC

+0

我應該手動添加50個值 – user3153983

1

疑問句[5]是一個int,則可以不是數組指派給它

此外,C不允許在這樣的陣列分配多個元件。您只能在初始化時執行此操作

0
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; 
} 
+0

我很確定你的意思是把-7從-7增加到-6。 因此,使用'++ start'而不是'start - '或'--start' – CinCout

+1

@gargankit糟糕,固定。謝謝。 –

4

如果你有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()。我快速地避開了;重複該化合物字面感覺並不像向右移動,但手動計數不是一個好的解決辦法。

那麼,你可以如果memmove()不是一個反對給出7個參數而不是3的宏(Mac OS X 10.9.2上的GCC 4.8.2)!

(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(),而不是一個宏。第二個通過在複合文字周圍包圍圓括號來創建單個參數。兩者都編譯。

請注意,雖然複合文字看起來像是一個cast和一個括號初始值設定項,但我不確定它是否完全是一個演員 - 最好不要將它看作是一個強制轉換,而應該是一個複合文字。順便提一下,如果目標是將N個隨機值添加到N個整數的數組中(如comment中提到的其他答案中所述),那麼您不會希望使用這種技術 - 例子是不合理的隨機序列。如果你在一定範圍內做要50個隨機數字,你將使用一個隨機數發生器(可能rand(),可能 lrand48(),可能是別的東西),在適當的範圍內創造價值,用一個簡單的循環for初始化正確的號碼數組元素。

+0

使用類型轉換和'memmove'('memcpy')的好方法。 ++ my_knowledge,因此++投票。 :-) –

+0

「我不確定這是嚴格的演員」 - 不是,因爲{{}}不是表達式。 –

+0

+1是唯一瞭解C99的人。真令人沮喪。 – unwind

0

地塊的時候,我沒有計劃在C,但我認爲,你可以做一個完整的數組聲明的唯一情況是在時,你把它聲明:

int a[] = {...} 

但不是這樣:

int a[5]; 
a = {...}; 

而且,你的情況,你正在做

int a[5] = {...} 

,這意味着你想一個將數組分配給一個整數。

此外,它的更好,如果你這樣做not do a cast in the malloc call

cases[0].ques = malloc(cases[counter].len * sizeof(int)); 
1

我希望你明白爲什麼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個元素。現在儘管它不會給出錯誤,但要準備好獲得一些意想不到的結果。 :)

+0

'arr [5]'是一個甚至不是數組的一部分的索引;它是超出數組末尾的一個元素。 –

+0

哦,是的,忘了提及。在考慮答案的一半時,我考慮到了這一點。將它添加到答案中。謝謝 – Kraken