C语言结构体指针中的const成员怎么初始化

typedef struct {
int* const p;
} C;

int main()
{
int i = 0;
C* c = (C*)malloc(sizeof(C));
c->p = &i;
free(c);
return 0;
}

上面的例子中
c->p = &i;
这句话会报出错误只读量无法被赋值,那么我该怎么做才能初始化c让它的成员p指向i呢?
我的目的是初始化它的值,不是改变它的值。使用结构体而不是结构体指针时时可以这么干
C cc = { &i };
那么结构体指针该怎么初始化其成员呢?

PS: 我用的是MinGW gcc

六楼的方法确实很不提倡,不过如果实在不行也只能这样了……
最新回答
瑾沫流年

2024-11-05 12:18:45

方法是有的,不过并不太赞成这种做法,不过如果仅仅是作为初始化使用的话,可以先定义一个初始化的函数,并保证在别的地方不再调用这个函数,倒也可以行,代码如下:
#include <stdio.h>
#include <malloc.h>

typedef struct
{
int* const p;

} C;

int main()
{
int i = 0;
C* c = (C*)malloc(sizeof(C));
printf("Old: 0x%08X\n", c->p);
(int*)(c->p) = &i; // 最关键的一步。
printf("new: 0x%08X\n", c->p);
free(c);
return 0;
}

----------------------------------- 补充1
C中是没有构造函数的概念的,所以妄图想C++那样在对象构造的同时对对象进行初始化是误解的,唯一的方法就是写一个特殊的函数,用这个函数来初始化一个结构体的内存,甚至可以用memset()函数都可以,所以你的要求已经退化成如何对结构体进行初始化了,这是很多C++程序员回头写C程序的时候,都会反复思考的问题。
认真的老去

2024-11-05 14:25:46

楼主这种想法是错误的,是对概念的误解。根本不能这么写。
语法:禁写指针
声明语句格式为: 数据类型 * const 指针变量名
你看上面const后面要求的是指针变量名,它是一个变量。
而在结构体的定义中定义的只是数据的类型和名称,花括号{}中没有变量,变量在最后的花括号'}'后面分号';'前面。
struct s{//这时,未定义结构体变量,只是已将静态成员的空间大小安排好。
int id;//这里的id,eng根本不是一个变量,只是一个名称符号
int eng;//
};//变量在这里分号前面定义
所以下面的写法根本不合语法。
typedef struct {
int* const p; //p根本就不是变量嘛,怎么能放在禁写指针语法中
} C;
我在时光深处等你

2024-11-05 09:45:17

想不出来正常的方法...

不过你可以*(int **)&c->p = &i...

--

真热闹|||

“常量指针必须在定义时初始化。”C语言里不能在定义结构体的时候对成员初始化。

“楼主这种想法是错误的,是对概念的误解。根本不能这么写。 ”咱这些挂牌的说话负点责任好不好b...

“(int*)(c->p) = &i; // 最关键的一步。”gcc里允不允许这样我还真不知道... 但是左值不能直接类型转换的吧
碎雨带风

2024-11-05 01:39:24

我觉得你的大写的那个C,没有定义类型啊!~(int C*)malloc(sizeof(C)); 用const那你就得看看我的学习笔记
int x = 10;
int* p = &x;
*p = 20; //修改指针指向的内容

int y = 30;
p = &y; //修改指针保存的地址

const int *pp = &x; //不能通过*pp修改pp指向的内容,也就是定义pp为常量指针。也可以写成 int const *pp
//*pp = 50; 错的
pp = &y;

int* const qq = &x; //不能修改qq,也就是定义qq为指针常量
*qq = 50;
//qq = &y; 错的

const int* const ww = &x; //既不能修改ww指向的内容,也不能修改ww本身。也就是定义ww为指向常量的指针常量。
//*ww = 50; 错
//ww = &y;错
晴时不见荷

2024-11-05 16:03:32

1、方法是有的,不过并不太赞成这种做法,不过如果仅仅是作为初始化使用的话,可以先定义一个初始化的函数,并保证在别的地方不再调用这个函数,倒也可以行。
2、代码如下:
#include <stdio.h>
#include <malloc.h>
typedef struct{
int* const p;} C;int main(){int i = 0;
C* c = (C*)malloc(sizeof(C));
printf("Old: 0x%08X\n", c-p);