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; }----------------------------------- 补充1C中是没有构造函数的概念的,所以妄图想C++那样在对象构造的同时对对象进行初始化是误解的,唯一的方法就是写一个特殊的函数,用这个函数来初始化一个结构体的内存,甚至可以用memset()函数都可以,所以你的要求已经退化成如何对结构体进行初始化了,这是很多C++程序员回头写C程序的时候,都会反复思考的问题。
楼主这种想法是错误的,是对概念的误解。根本不能这么写。 语法:禁写指针 声明语句格式为: 数据类型 * const 指针变量名 你看上面const后面要求的是指针变量名,它是一个变量。 而在结构体的定义中定义的只是数据的类型和名称,花括号{}中没有变量,变量在最后的花括号'}'后面分号';'前面。 struct s{//这时,未定义结构体变量,只是已将静态成员的空间大小安排好。 int id;//这里的id,eng根本不是一个变量,只是一个名称符号 int eng;// };//变量在这里分号前面定义 所以下面的写法根本不合语法。 typedef struct { int* const p; //p根本就不是变量嘛,怎么能放在禁写指针语法中 } C;
想不出来正常的方法... 不过你可以*(int **)&c->p = &i...--真热闹|||“常量指针必须在定义时初始化。”C语言里不能在定义结构体的时候对成员初始化。“楼主这种想法是错误的,是对概念的误解。根本不能这么写。 ”咱这些挂牌的说话负点责任好不好b...“(int*)(c->p) = &i; // 最关键的一步。”gcc里允不允许这样我还真不知道... 但是左值不能直接类型转换的吧
我觉得你的大写的那个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;错
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);