C语言结构体问题:1.初始化结构体里的指针参数时为什么不需要malloc申请内存空间?2.free()掉结构体中某一个指针参数之后,为什么这个结构体里的其他参数也无法访问了?


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申请内存空间

如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

img

字符串常量是编译器分配的内存,在静态区。你可能对内存管理有点误区,不仅仅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="的马戏呀";
这是把指针指向了一个字符串常量,字符串常量当然占据内存空间,不需要再次分配空间

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632