【问题标题】: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)。在那里传递指针是不必要的
  • 好吧,这是有道理的。感谢您(非常)及时的回复。
  • 注意:不要在-> 运算符周围添加空格。这看起来很丑陋,而且更难阅读。
  • 是的,问这个问题是个错误,在我的实际程序中,函数签名看起来像你说的那样。

标签: c function pointers struct variable-assignment


【解决方案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 有帮助吗?
    猜你喜欢
    • 2014-07-03
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 2018-07-01
    • 2012-07-18
    相关资源
    最近更新 更多