结构体指针初始化问题

hml1006 2011-08-31 11:02:36

#include <stdio.h>
struct person;
char *get_name(struct person *);
int get_age(struct person *);
struct person {
char name[20];
int age;
char *(*get_name)(struct person *);
int (*get_age)(struct person *);
};

char *get_name(struct person *p)
{
return p->name;
}

int get_age(struct person *p)
{
return p->age;
}

int main()
{
struct person person = {"huang",21,get_name,get_age};
struct person *p = &person;
printf("Name: %s\n",p->get_name(p));
printf("Age : %d\n",p->get_age(p));
return 0;
}

上面的代码运行正常,但是把
struct person person = {"huang",21,get_name,get_age};
struct person *p = &person;
替换成struct person *p = {"huang",21,get_name,get_age};
编译gcc -o call call.c
call.c: In function ‘main’:
call.c:24: warning: initialization from incompatible pointer type
call.c:24: warning: excess elements in scalar initializer
call.c:24: warning: (near initialization for ‘p’)
call.c:24: warning: excess elements in scalar initializer
call.c:24: warning: (near initialization for ‘p’)
call.c:24: warning: excess elements in scalar initializer
call.c:24: warning: (near initialization for ‘p’)
运行时出现 段错误
结构体指针为什么不能struct person *p = {"huang",21,get_name,get_age};这样初始化???
...全文
963 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
linux里都是这样的结构体。
  • 打赏
  • 举报
回复
1 #include <stdio.h> 2 struct person; 3 char *get_name(struct person *); 4 int get_age(struct person *); 5 struct person { 6 char name[20]; 7 int age; 8 char *(*get_name)(struct person *); 9 int (*get_age)(struct person *); 10 }; 11 12 char *get_myname(struct person *p) 13 { 14 return p->name; 15 } 16 17 int get_myage(struct person *p) 18 { 19 return p->age; 20 } 21 22 int main() 23 { 24 struct person person = { 25 .name ="huang", 26 .age = 21, 27 .get_name = get_myname, 28 .get_age = get_myage 29 }; 30 struct person *p = &person; 31 printf("Name: %s\n",p->get_name(p)); 32 printf("Age : %d\n",p->get_age(p)); 33 return 0; 34 }
q8810783 2011-08-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hml1006 的回复:]
char *str = "hello world";都行
[/Quote]

关键是 {} 这个符号
{} 只能在定义并初始化结构体的时候使用
"hello world" 能放在程序的任何地方。
{结构体} 就不行了
morebread 2011-08-31
  • 打赏
  • 举报
回复
就好像int a = 6;
bool b = false;
char *c = "123";
这些变量类型都是c++内置类型,在这种情况下都是放到常量内存中。
但要是你自己定义的结构体或者数据结构的话,就要先分配内存再初始化了
zjw6861982 2011-08-31
  • 打赏
  • 举报
回复
你见过int *p = 2;这样的写法吗?

一般指针是不允许用常量赋值的
xiaoguangzaia 2011-08-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hml1006 的回复:]
char *str = "hello world";都行
[/Quote]

这个指针是指向字符串常量区的,这块内存是只读的
你试试str[2] = 'a';可以吗

一般的指针需要在堆上动态分配内存后才能够赋值
xiaoguangzaia 2011-08-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hml1006 的回复:]
char *str = "hello world";都行
[/Quote]

这个指针是指向字符串常量内存的,这个内存是只读的
你试下str[1] = ‘a';可以吗

一般指针分配内存是在堆里面,如果没有分配内存就不能够赋值
hml1006 2011-08-31
  • 打赏
  • 举报
回复
如果用malloc分配内存,结构体里的东西就放到堆里边了
结构体指针为什么不能像字符串指针一样初始化???
why
hml1006 2011-08-31
  • 打赏
  • 举报
回复
char *str = "hello world";都行
ryfdizuo 2011-08-31
  • 打赏
  • 举报
回复
先申请Person的内存,然后对成员赋值。name数组用strcpy赋值。
jackyjkchen 2011-08-31
  • 打赏
  • 举报
回复
struct person *p = {"huang",21,get_name,get_age};
根本没分配内存啊
xiaoguangzaia 2011-08-31
  • 打赏
  • 举报
回复
没分配内存啊
leebigmouth 2011-08-31
  • 打赏
  • 举报
回复
内存分配问题,结构体不能如此初始化。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧