[英]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);
}
注意:我已經搜索了這樣的示例,但找不到,並且時間已用完。 如果已經問過問題,非常抱歉浪費您的時間,請向我提供鏈接以供參考。
有兩個重要的問題需要考慮:
const struct p*
是“指向const p
指針”,這意味着您無法修改其指向的實例。 它可以指向非const
對象,但是您不能使用指針來修改該對象。
指針必須指向有效對象,然后才能取消引用。
您需要創建一個有效的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;
在兩個示例中,您都可以分別通過x
和px
修改實例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.