【问题标题】:Passing a structure by reference and manipulating it通过引用传递结构并对其进行操作
【发布时间】:2010-12-21 04:01:28
【问题描述】:
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 设置为随机大小的变量而不是字符串文字,是否有必要?

【问题讨论】:

    标签: c data-structures pointers argument-passing strdup


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      这两个选项都非常冒险,因为您不知道数组的长度。因此,访问 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 是姓氏数组的长度。

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

      【讨论】:

        【解决方案3】:

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

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

        在您的示例中使用文字时,strdup 不是必需的:您可以直接分配给 char*

        【讨论】:

          【解决方案4】:

          array-&gt;name(*array).name 完全相同。

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

          【讨论】:

            猜你喜欢
            • 2016-02-25
            • 2013-07-22
            • 2013-06-04
            • 1970-01-01
            • 2013-05-12
            • 2011-02-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多