c语言未赋初值的结构体指针详解

本文探讨了C语言中结构体指针的使用,特别是涉及动态内存分配的情况。作者通过示例代码展示了未初始化的结构体指针和已分配内存的结构体成员之间的差异。当结构体内部包含指针变量时,必须额外为其分配内存才能正确赋值。否则,尝试访问这些未分配内存的成员会导致不可预测的结果。文章强调了理解内存管理和指针的关系对于避免程序错误的重要性。
摘要由CSDN通过智能技术生成

最近看到了结构体指针的内容,发现未赋初值的结构体指针的特性很有意思,做一个文档记录一下。

首先看如下代码

#include <stdio.h>
#include <cstdlib>
#include <cstring>

int main()
{
  struct PERSON{
    char *name;
    int age;
    float salary;
  } *p;
  p = (struct PERSON *) malloc(sizeof(p));
  //p->age = (int*) malloc(5);
  //p->age = 27;
  //strcpy(p->name, "marry");
  printf("%d\n", sizeof(p));
  printf("%d\n", &(p));
  printf("%d\n", &(p->name));
  printf("%d\n",&(p->age));
  printf("%d\n",&(p->salary));
}

输出为

8
6422040
10556384
10556392
10556396

可以看到P和构造体内的元素的地址都已经分配了。
但是如下代码

#include <stdio.h>
#include <cstdlib>
#include <cstring>

int main()
{
  struct PERSON{
    char *name;
    int age;
    float salary;
  } *p;
  p = (struct PERSON *) malloc(sizeof(p));
  //p->name = (char*) malloc(5);
  p->age = 27;
  strcpy(p->name, "marry");
  printf("%d\n", sizeof(p));
  printf("%d\n", &(p));
  printf("%s\n", p->name);
  printf("%d\n", p->age);
  printf("%d\n", p->salary);
}

输出却是什么都没有。
如果加上中间给name分配内存的那一句的话

8
6422024
marry
27
0

就会输出结果。

至于原因我理解是虽然已经给指针P分配了内存,但是这个是构造体整体的内存空间。如果构造体内部还存在指针变量,则需要另外的为这个指针变量分配内存。如果构造体内不没有指针变量,则不需要分配内存就可以直接赋值。我觉得这里的构造体内部元素的指针和构造体指针没有关系导致的这个结果。我本人也是小白,如果有哪位大神知道具体原因,还请告知。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值