2009-11-28 33 views
0
typedef struct unit_class_struct { 
    char *name; 
    char *last_name; 
} person; 


int setName(person *array) { 

    array[0].name = strdup("Bob"); 
    array[1].name = strdup("Dick"); 

    return 1; 
} 

int setLastName(person *array) { 

    array->last_name = strdup("Sanchez"); 
    array++; 
    array->last_name = strdup("Clark"); 

    return 1; 
} 

int main() 
{ 
    person array[10]; 
    person *pointer; 
    pointer = array; 
    setName(pointer); 
    setLastName(pointer); 
    printf("First name is %s %s\n", array[0].name, array[0].last_name); 
    printf("Second name is %s %s\n", array[1].name, array[1].last_name); 
    while(1) {} 
    return 0; 
} 

這是我想出的一些示例代碼,用於結構化。 請注意我在setName中設置名稱的方式,以及我在setLastName中設置名稱的方式。通過引用傳遞一個結構並對其進行操作

這兩個工作,但我很好奇兩種方式之間的區別是什麼呢?

一種比另一種好嗎?

這個例子中還需要strdup嗎?如果沒有,如果我將array.name設置爲隨機大小的變量而不是字符串文字,是否有必要?

回答

0

使用索引方法比使用指針算法稍微清晰,在我看來,但要麼工作。我懷疑編譯器爲每個代碼生成的代碼在兩個實例中都非常相似。

strdup在此實例中是必要的,因爲如果您正在使用變量,因爲您沒有分配內存來將字符串值保存在person結構中。如果你已經爲這些字符串分配了空間,那麼在調用任何一個設置器時,strcpy(最好是strcpy_s)就足夠了。

在您的示例中使用文字時,不需要strdup:您可以直接指定給char*

1

如果您將所有的.name's設置爲字符串常量,那麼不會嚴格需要strdup。如果您稍後要修改字符串,您會需要它。指針和內存管理的更好的基礎將明確區分。如果您確實使用strdup,請務必在free之後。

1

這兩個選項都很危險,因爲你不知道數組的長度。因此,訪問array ++或array [1]的結果可能會導致未定義的行爲。

也許你可以試試這個apprach

int set_last_name(person* array, char* lastnames[],size_t amount){ 
    int i=0; 

    for(;i<amount;i++,array++){ 
     strncpy(array->lastname,lastnames[i],strlen(lastnames[i])); 
    } 

    return 1; 
} 

哪裏量是lastnames數組的長度。

請注意,theres沒有使用strdup。這個函數會期望用戶爲lastnames和array分配內存。然後,如果需要,用戶應該釋放該內存。 我不喜歡strdup,因爲它返回一個堆分配的字符串,並且在函數的情況下,應清楚地記錄函數的用戶必須釋放它。

0

array->name(*array).name完全相同。

在你的兩個函數中,「array」是指向一個結構體的指針,所以*arrayarray[0]都是結構體,你可以設置它們的成員。箭頭符號只是一個常用的捷徑。

相關問題