2011-03-02 131 views
0
#include <stdlib.h> 
#include <stdio.h> 

struct foo{ 
    int id; 
    char *bar; 
    char *baz[6]; 
}; 

int main(int argc, char **argv){ 
    struct foo f; 
    f.id=1; 

    char *qux[6]; 

    f.bar=argv[0]; 
    f.baz=qux; // Marked line 

    return 1; 
} 

這只是一些測試代碼,所以忽略qux實際上沒有任何有用的東西。C:不兼容的類型?

我在標記行上發現一個錯誤,incompatible types when assigning to type ‘char *[6]’ from type ‘char **’但在代碼中將這兩個變量定義爲char *[6]。任何見解?

+0

' char * baz [6];'聲明一個由6個指針組成的數組。如果你想聲明一個指向數組的指針,寫'char(* baz)[6];' – pmg 2011-03-02 09:09:44

回答

9

與此代碼的問題是,所述線

f.baz=qux; 

試圖陣列qux分配給數組baz。在C中,數組不是變量,不能分配新值。要看到一個簡單的例子,下面的代碼:

int arr1[10], arr2[10]; 
arr1 = arr2; // Error! 

是非法的,因爲第二行試圖將第二陣列分配第一的價值,這是不是在C.

允許爲了解決這個問題,你「可能會想要寫一個顯式循環的元素複製過來,因爲在這裏看到:

int i; 
for (i = 0; i < 6; ++i) 
    f.baz[i] = qux[i]; 

這是合法的,因爲陣列的每個元素是一個char *,可以分配。

,有時能看到用於指定數組memcpy

memcpy(f.baz, qux, sizeof f.baz); 

此副本在陣列中的所有字段的原始字節。

3

您不能複製數組一樣,在C.你必須將它們複製元素的元素:

int i; 
for (i = 0; i < 6; ++i) 
    f.baz[i] = qux[i]; 
0

在C語言中,你直接做任務到物理內存。您可以在8,16,32或64位指向內存。數組分配需要以與您可指向的可能部分相匹配的部分完成。

如果有必要指出在不同時間的多個這樣的數組,你可以這樣做:

struct foo{ 
    char **baz; 
}; 

這應該允許您更改數組被指向爲你做:

f.baz=qux;