【问题标题】:How to assign values to a const structure pointer's variable?如何为 const 结构指针的变量赋值?
【发布时间】:2015-06-29 06:59:07
【问题描述】:

在下面的代码中,我无法单独更改 x 和 y 的值。有人可以帮我单独分配这些值吗?

#include <stdio.h>

struct p
{  
    int x;
    int y;
};

int main()
{   
    int p2 = 55;
    int p3 = 99;
    //const struct p *ptr1 = {&p2,&p3};  --- giving the expected result
    const struct p *ptr1;
    ptr1->x = &p2;  //error
    ptr1->y = &p3;  //error
    printf("%d %d \n", ptr1->x, ptr1->y);
}

注意:我已经搜索过这样的示例,但我无法找到并且我的时间不多了。如果问题已经被问到,我真的很抱歉浪费您的时间,请提供链接供我参考。

【问题讨论】:

  • p2p3 的地址似乎被强制转换为整数值?什么预期的结果?
  • 所以问题是,当您尝试取消引用 const 时,unallocated 用于编写编译器的指针不会执行从 int *int 的隐式转换并静默编写。跨度>

标签: c pointers structure constants


【解决方案1】:

由于作者似乎想要更改她声明为 const 的结构,这实际上可能是一个非常相关的答案。

与这个问题直接相关的一个常见问题是

const struct p *ptr1

是指向“const struct p”的指针,这意味着指针变量 ptr1 可以更改并稍后指向不同的 struct p,但无论它指向何处,您都不能使用它写入 struct 的成员指针(例如ptr1-&gt;x = blah;)。

有些人可能正在寻找的是一个常量指针,因此在初始化时被分配一个内存后,它永远不能指向不同的内存。

那就是

struct p * const ptr2 = ptr1   // whatever ptr1 currently points to, ptr2 will point to there, from now to forever (for the lifetime / scope of ptr2).

【讨论】:

    【解决方案2】:

    有两个重要的问题需要考虑:

    1. const struct p* 是“指向const p 的指针”,这意味着您不能修改它指向的实例。它可以指向一个非const 对象,但你不能使用指针来修改该对象。

    2. 一个指针必须指向一个有效的对象才能被取消引用。

    你需要创建一个有效的p实例,然后让指针指向它:

    struct p x = {p2, p3};
    const struct p *ptr1 = &x;
    

    在本例中,在自动存储中创建了一个p 实例。如果更适合您的需求,您还可以使用malloc 动态实例化一个。例如,

    struct p *px = malloc(sizeof (struct p));
    px->x = p2;
    px->y = p3;
    const struct p *ptr1 = px;
    

    在这两个示例中,您可以修改实例ptr1 分别指向通过xpx,但不能通过ptr1

    【讨论】:

    • 我只需要更改一些结构值,而不是整个结构
    • @Denise 你可以通过xpx 做到这一点。请注意,ptr1 不允许修改它指向的对象。
    【解决方案3】:
    const struct p *ptr1 = {&p2,&p3}; //  --- giving the expected result
    

    它可以编译,但是有这个警告;不管怎样,它可能不会做你想做的事:

    警告:使用“int *”类型的表达式初始化“const struct p *”的不兼容指针类型[-Wincompatible-pointer-types]

    要创建一个指向结构的常量指针,你可以这样:

    const struct p *ptr1 = &(struct p){p2, p3};
    

    关于lifetime的快速说明:

    如果复合文字出现在函数体之外,则对象具有静态存储持续时间;否则,它具有与封闭块关联的自动存储持续时间。

    【讨论】:

    • RHS 上右值的生命周期是否得到延长?
    • 临时对象的生命周期是多少?
    • @Ja͢ck 临时的生命周期得到延长,在这种情况下你应该在你的答案中提及它,或者它没有,在这种情况下代码是非法的。我在问一个真正的问题,以防这是 ​​C 与 C++ 不同的地方之一。在后者中,代码将是非法的。
    • @juanchopanza 我已经包含了一段应该适用于此处的标准;这里的生命周期应该main() 内是自动的。当然,我可能是错的.. :)
    • @Ja͢ck 这似乎是正确的。因此,这里的 C 与 C++ 看起来确实不同。我将删除我以前的一些 cmets。
    猜你喜欢
    • 2011-01-20
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    相关资源
    最近更新 更多