【问题标题】:accessing structure's member by using pointer使用指针访问结构的成员
【发布时间】:2016-08-06 16:56:32
【问题描述】:

我在 gcc(x64) 上编译了下面的代码。

为什么我可以通过 dot(people[0].name) 而不是 '->' 来访问结构项?

people[0] 不是指向结构的地址,我应该使用 people[0]->name 或 (*people[0]).name 来访问名称吗?

代码:

#include <stdio.h>

#define TOTAL 4

int main(void) {
    typedef struct tagPerson {
        char name[12];
        int ID;
    } Person;

    #define LPPERSON Person*

    Person * people = calloc(sizeof(Person), TOTAL);
    strncpy(people[0].name, "Henry", 12);
    strncpy(people[1].name, "Jacob", 12);

    printf("sizeof(people)=%d\n", sizeof(people));
    printf("people[0].name=%s\n", people[0].name);
    printf("sizeof(people[0])=%d\n", sizeof(people[0]));
    printf("people[1].name=%s\n", people[1].name);
    printf("sizeof(people[1])=%d\n", sizeof(people[1]));

    free(people);

    return 0;
}

输出:

sizeof(people)=8

people[0].name=Henry
sizeof(people[0])=16

people[1].name=Jacob
sizeof(people[1])=16

【问题讨论】:

  • 您已将调用中的参数切换为calloc
  • 不是calloc只返回一个指向分配内存最低字节的指针吗?
  • 您使用strncpy() 是危险的。 (嗯,每次使用 strncpy() 都是危险的......)

标签: c pointers structure


【解决方案1】:

people 是指向Person 的指针。 E1[E2] 是数组下标运算,等于*((E1) + (E2)) (6.5.2.1)。这里E1 必须是指向T 的指针,E2 必须是整数类型。整个表达式的类型只是 T。在您的情况下,E1 是指向Person 的指针,因此people[0] 的类型为Person,并且通过. 而不是-&gt; 执行对字段的访问。

如果您想使用箭头 - 您可以通过以下方式进行:

(people + 1)->name; /* the same as people[1].name */

【讨论】:

    【解决方案2】:

    Person * people 表示:

    people的数据类型为Person *,即pointerPerson

    和;

    *people 的数据类型是Person,即Person 数据类型。同样,*(people + index) 的数据类型也是Person

    因为people[index] 在内部被转换为*(people + index),所以people[index] 的数据类型是Person- 而不是pointer to Person

    由于people[index] 的数据类型为Person,而不是pointer to Person,因此您可以使用. 运算符而不是-&gt; 运算符来访问其成员。

    【讨论】:

      【解决方案3】:

      因为 people 是 person 结构的数组,而不是指针。如果您的数组包含指针,则需要使用箭头符号。您可以在不使用指针和结构数组的情况下创建结构。

      【讨论】:

      • 变量people不是数组,而是指向可以当做一个的内存。
      • 确实如此。一般来说数组也是如此,所以我不知道这种区别有多大帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-01
      • 1970-01-01
      相关资源
      最近更新 更多