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

typedefstruct{int*constp;}C;intmain(){inti=0;C*c=(C*)malloc(sizeof(C));c->p=&i;free(c... 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

六楼的方法确实很不提倡,不过如果实在不行也只能这样了……
展开
 我来答
Idealsoft
2009-02-25 · TA获得超过639个赞
知道小有建树答主
回答量:461
采纳率:0%
帮助的人:290万
展开全部
方法是有的,不过并不太赞成这种做法,不过如果仅仅是作为初始化使用的话,可以先定义一个初始化的函数,并保证在别的地方不再调用这个函数,倒也可以行,代码如下:
#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程序的时候,都会反复思考的问题。
冒险岛乐乐
2009-02-23 · TA获得超过1969个赞
知道小有建树答主
回答量:621
采纳率:0%
帮助的人:0
展开全部
楼主这种想法是错误的,是对概念的误解。根本不能这么写。
语法:禁写指针
声明语句格式为: 数据类型 * const 指针变量名
你看上面const后面要求的是指针变量名,它是一个变量。
而在结构体的定义中定义的只是数据的类型和名称,花括号{}中没有变量,变量在最后的花括号'}'后面分号';'前面。
struct s{//这时,未定义结构体变量,只是已将静态成员的空间大小安排好。
int id;//这里的id,eng根本不是一个变量,只是一个名称符号
int eng;//
};//变量在这里分号前面定义
所以下面的写法根本不合语法。
typedef struct {
int* const p; //p根本就不是变量嘛,怎么能放在禁写指针语法中
} C;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
BlueWanderer
2009-02-23 · TA获得超过9209个赞
知道大有可为答主
回答量:5673
采纳率:83%
帮助的人:2002万
展开全部
想不出来正常的方法...

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

--

真热闹|||

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

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

“(int*)(c->p) = &i; // 最关键的一步。”gcc里允不允许这样我还真不知道... 但是左值不能直接类型转换的吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友b8e4461
2009-02-23 · TA获得超过667个赞
知道小有建树答主
回答量:657
采纳率:0%
帮助的人:588万
展开全部
我觉得你的大写的那个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;错
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
tattackor
2015-10-31 · TA获得超过3.5万个赞
知道大有可为答主
回答量:5083
采纳率:94%
帮助的人:885万
展开全部
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);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(7)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式