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 设置为随机大小的变量而不是字符串文字,是否有必要?

4

4 回答 4

1

如果您将所有 .name 设置为字符串常量,那么不,strdup不是严格需要的。如果您稍后要修改字符串,您将需要它。更好的指针和内存管理基础将使区别变得清晰。如果您确实使用strdup,请确保free稍后获得结果。

于 2009-11-28T05:53:26.767 回答
1

这两种选择都很冒险,因为你不知道数组的长度。因此,访问 array++ 或 array[1] 的结果可能会导致未定义的行为。

也许你可以试试这个方法

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

其中amount 是lastnames 数组的长度。

请注意,没有使用 strdup。该函数期望用户为姓氏和数组分配内存。然后,如果需要,用户应该释放该内存。我不喜欢 strdup 因为它返回一个堆分配的字符串,并且在您的函数的情况下,应该清楚地记录函数的用户必须释放它。

于 2009-11-28T05:56:10.310 回答
0

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

在您的两个函数中,“数组”都是指向结构的指针,因此*arrayarray[0]都是结构,您可以设置它们的成员。箭头符号只是一种常用的快捷方式。

于 2009-11-28T12:31:16.360 回答
0

在我看来,使用索引方法比使用指针算法稍微清晰一些,但两者都有效。我怀疑编译器为每个生成的代码在两种情况下都非常相似。

strdup如果您正在使用变量,则在这种情况下是必要的,因为您没有分配内存来将字符串值保存在person结构中。如果您在调用任何一个设置器时已经为这些字符串分配了空间,则strcpy( strcpy_s,最好) 就足够了。

在您的示例中使用文字时,strdup没有必要:您可以直接分配给char*.

于 2009-11-28T05:53:14.873 回答