繁体   English   中英

如何为const结构指针的变量赋值?

[英]How to assign values to a const structure pointer's variable?

在下面的代码中,我无法单独更改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);
}

注意:我已经搜索了这样的示例,但找不到,并且时间已用完。 如果已经问过问题,非常抱歉浪费您的时间,请向我提供链接以供参考。

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

  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;

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

const struct p *ptr1 = {&p2,&p3}; //  --- giving the expected result

它会编译,但带有此警告; 无论哪种方式,它可能都无法满足您的需求:

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

要创建指向struct的常量指针,可以使用以下命令:

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

关于寿命的简要说明:

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

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

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

const struct p *ptr1

是指向“ const struct p”的指针,这意味着指针变量ptr1可以在以后更改并指向另一个struct p,但是无论指针指向何处,您都无法使用该指针写入该结构的成员(例如ptr1->x = blah; )。

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

那会是

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).

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM