关于结构的未初始化指针分配的语义

Posted

技术标签:

【中文标题】关于结构的未初始化指针分配的语义【英文标题】:Semantics of assignment of an unitialized pointer in regards to structures 【发布时间】:2015-10-26 03:40:01 【问题描述】:

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

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;

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

struct Person *tom;

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

*tom = person(20, 70);

或者这个:

tom = person(20, 70);

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

【问题讨论】:

tom = person(20, 70); 是正确的。当您从函数返回指针时,无需取消引用指针 tom 另外,由于您的 ageheight 成员本身不是指针,因此函数签名应如下所示 person (int age, int height)。在那里传递指针是不必要的 好吧,这是有道理的。感谢您(非常)及时的回复。 注意:不要在-> 运算符周围添加空格。这看起来很丑陋,而且更难阅读。 是的,问这个问题是个错误,在我的实际程序中,函数签名看起来像你说的那样。 【参考方案1】:

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

嗯,“指针”是一个数字。就是这样。我可以做(struct Person*) 0xDEADBEEF,这将是完全有效的——C 会接受它(注意:不要尝试取消引用它,因为这会导致未定义的行为)。然而,即使指针只是一个数字,该数字 的含义 更重要 - 该数字表示存储实际数据的地址。但请记住,所有指针都是is just a number。

当您使用malloc 分配一些内存时,它会返回一个数字 - 此数字引用您的数据应存储在内存中的点。这个数字可以像其他数字一样传递。但是,当“取消引用”时,C 实际上会处理您正在访问的内存中的数据:

这个“数字”可以由函数返回,传递给函数,以及其他数字可以做的所有其他花哨的事情。由于数字始终不变,因此取消引用指针将始终指向同一位置。

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

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

希望对您有所帮助。

【讨论】:

【参考方案2】:

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

这是要走的路:

tom = person(20, 70);

另外,对于 (int *age, int *height),不需要在您的签名中接收 int *:

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

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

我会坚持这个:

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

【讨论】:

@brandonb 有帮助吗?

以上是关于关于结构的未初始化指针分配的语义的主要内容,如果未能解决你的问题,请参考以下文章

可以初始化/分配结构指针吗?

C++构造奇怪的未初始化指针

C++结构体指针数组如何分配空间,用new

通过指针初始化结构

指针 分配空间

在结构内分配双指针结构?