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

来源:百度知道 编辑:UC知道 时间:2024/06/27 23:51:36
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

六楼的方法确实很不提倡,不过如果实在不行也只能这样了……

方法是有的,不过并不太赞成这种做法,不过如果仅仅是作为初始化使用的话,可以先定义一个初始化的函数,并保证在别的地方不再调用这个函数,倒也可以行,代码如下:
#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程序的时候,都会反复思考的问题。

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