簡體   English   中英

語法錯誤:“ {”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM