struct Hero1
{
int id;
char* name;
char* skill;
int level;
int hp;
int mp;
};
void main()
{
struct Hero1 hero_3 = { 1,"的马戏呀", "青钢影", 1, .mp=100 , .hp=500 };
hero_3.name=(char*)malloc(50);//问:既然修改名称之前需要对指针指向的区域分配内存空间,那为什么在前面大括号里赋初值的时候,不需要开辟内存空间呢?
printf("修改英雄的名称为:");
scanf("%s",hero_3.name);
printf("%d %s %s %d %d %d\n",hero_3.id,hero_3.name,hero_3.skill,hero_3.level,hero_3.hp,hero_3.mp);
free(hero_3.name);
//printf("%d\n",hero_3.id);问:free结构体中某一个指针之后,居然其他的参数也没有办法访问了。非常奇怪。
}
你 struct Hero1 hero_3 = { 1,"的马戏呀", "青钢影", 1, .mp=100 , .hp=500 };
是直接定义一个结构体变量,是自动为这个变量分配内存空间,不需要malloc
只有定义结构体指针类型的变量 struct Hero1 *p; 才需要用malloc申请内存空间
如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!
字符串常量是编译器分配的内存,在静态区。你可能对内存管理有点误区,不仅仅malloc出来的是内存,你定义的变量,字符串常量等等都是编译器为你分配的内存。malloc只是获得内存的一种方式,获得的是堆上的内存。但是不仅仅只有这一种方式。
int a = 0;
int* p = &a; //a没有malloc,为什么p可以指向a? 这跟你的问题是不是同一个问题?
p = (int*)malloc(sizeof(int)); // p也可以指向malloc的
关于你的第二个问题,我将你的代码在gcc,clang,vs上都跑了一遍,free掉之后都可以正常访问hero_3.id。我也建议可以将代码放到多个编译器上跑跑。
其实,你的问题就等价于这样
char* name="的马戏呀";
这是把指针指向了一个字符串常量,字符串常量当然占据内存空间,不需要再次分配空间