关于结构的未初始化指针赋值的语义

Semantics of assignment of an unitialized pointer in regards to structures

好吧,假设你有这个结构:

struct Person
{
    int age;
    int height;
};

现在你有了这个函数来创建一个指向这个结构的指针:

struct Person *person (int *age, int *height)
{
    struct Person *person = malloc(sizeof(Person));
    person -> age = age;
    person -> height = height;
    return person;
}

然后,在主函数中你有这个:

struct Person *tom;

这是我的问题,我不知道是否要分配这些我这样做:

*tom = person(20, 70);

或者这样:

tom = person(20, 70);

如果需要进一步说明,请告诉我,我确定这只是我的一个简单的误解,唉。

您正在返回一个指针,因此无需取消引用您的指针。为了更清楚地说明这一点,如果你的函数 returns struct Person * 那么你的变量应该是 struct Person * (这有例外,但这是常见的规则)。

这是要走的路:

tom = person(20, 70);

此外,您的签名中无需接收 int * (int *age, int *height):

struct Person *person (int *age, int *height)

除非您想修改函数内的 ageheight 值。

我会坚持这样做:

struct Person *person (const int age, const int height)

一个对象的"pointer",就所有的意图和目的而言,是一个与对象本身完全不同的类型。例如,struct Personstruct Person* 是两种完全不同的类型——您甚至可以通过 运行 sizeof(struct Person) 注意到这一点,并将该输出与 sizeof(struct Person*) 进行比较。这是为什么?

嗯,"pointer" 是一个数字。仅此而已。我可以 (struct Person*) 0xDEADBEEF, and it would be perfectly valid - C would accept it (note: don't attempt to dereference it, though, because that would lead to undefined behavior). However, even though a pointer is just a number, what that number means is more important - that number represents an address of where the actual data is stored. But remember, all a pointer is is just a number.

当您使用 malloc 分配一些内存时,它 returns 一个数字 - 这个数字引用内存中应该存储数据的点。这个数字可以像其他数字一样传递。但是,当 "dereferenced," C 实际处理您正在访问的内存中的数据时:

这个 "number" 可以由一个函数返回,传递给一个函数,以及其他数字可以做的所有其他奇特的事情。由于数字始终不变,取消引用指针将始终指向同一个地方。

您的 person() 函数 returns 一个数字 发生 以寻址内存中包含 Person 结构的特定位置。这个数字仍然是一个指针类型,所以将它赋值给一个指针是可行的:

struct Person* person(const int age, const int height);
struct Person* newPerson;
newPerson = person(20, 40);

希望对您有所帮助。