2009-11-28 30 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]都是结构体,你可以设置它们的成员。箭头符号只是一个常用的捷径。

相关问题