簡體   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