关于结构的未初始化指针分配的语义
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
。
另外,由于您的 age
和 height
成员本身不是指针,因此函数签名应如下所示 person (int age, int height)
。在那里传递指针是不必要的
好吧,这是有道理的。感谢您(非常)及时的回复。
注意:不要在->
运算符周围添加空格。这看起来很丑陋,而且更难阅读。
是的,问这个问题是个错误,在我的实际程序中,函数签名看起来像你说的那样。
【参考方案1】:
对于所有意图和目的,指向对象的“指针”是与对象本身完全不同的类型。例如,struct Person
和struct 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)
除非你想修改函数内部的age
和height
值。
我会坚持这个:
struct Person *person (const int age, const int height)
【讨论】:
@brandonb 有帮助吗?以上是关于关于结构的未初始化指针分配的语义的主要内容,如果未能解决你的问题,请参考以下文章