对结构体指针使用malloc,成员内存空间申请问题

逗号君呐~ 2019-09-26 02:33:08
#include "stdio.h"
typedef struct //结点类型
{
int num; //编号
char name[9]; //姓名
} DataType;

typedef struct node //结点类型定义
{
DataType data; //结点数据域
struct node * next; //结点指针域
} ListNode;

typedef ListNode * LinkList;

int main(){
LinkList head;

printf("head=%d\n",head);
printf("head->next=%d\n",head->next);

head=(ListNode*)malloc(sizeof(ListNode));

printf("\n\n申请空间后\n\n");


printf("head=%d\n",head);
printf("head->next=%d\n",head->next);
}

以上代码运行结果:
head=1703740
head->next=2527232

申请空间后

head=7281184
head->next=-842150451

觉得有点看不懂,想请教一下几个问题:
1.申请空间前,head和head->next的地址都是一个正数,申请空间后,head的地址是一个正数,而head->next的地址是一个负数,这是为什么?
2.使用malloc给head申请空间时,指针next有分配到空间吗?
3.如果在使用了malloc后,直接用head->next=NULL,而不是用free(),会不会造成内存泄漏?如果是在使用malloc前呢?
4.另外还做了一个测试:
int *p;
printf("%d\n",p);
p=(int*)malloc(sizeof(int));
printf("%d\n",p);
运行结果是4215464和7733296,申请空间前后地址不同,但都是正数,这又是为什么?
...全文
875 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
stherix 2019-09-26
  • 打赏
  • 举报
回复 1
1.2. 申请后 head已经是指向合法内存的指针了,但是head指向的结构体内的其他指针仍然是空指针,比如next 3. 有mallc就要free,如果next没有=malloc过,那么就不需要free,反之也是,malloc和free要一一对应 4. c变量在初始化前,都可能是一个随机数(所以有可能负数),指针申请空间后,会等于申请的内存地址,所以会变化 打印指针 数值为 正数还是负数 都不能成为任何判断标准
Mapleas 2019-09-26
  • 打赏
  • 举报
回复 1
引用 2 楼 逗号君呐~ 的回复:
[quote=引用 1 楼 stherix 的回复:] 1.2. 申请后 head已经是指向合法内存的指针了,但是head指向的结构体内的其他指针仍然是空指针,比如next 谢谢回答,但是对这条回答我还有点疑问,“head指向的结构体内的其他指针仍然是空指针”,我用了语句 if(head->next==NULL) printf("NULL"); else printf("NO NULL"); 进行判断,结果输出NO NULL,为什么?
没有初始化的值不一定是空指针,它是所申请的内存空间里存在的一个值,大多数时候是一个极大的负值或者正值.编程的时候尽可能的保证对数据的初始化.
逗号君呐~ 2019-09-26
  • 打赏
  • 举报
回复
[quote=引用 1 楼 stherix 的回复:]
1.2. 申请后 head已经是指向合法内存的指针了,但是head指向的结构体内的其他指针仍然是空指针,比如next

谢谢回答,但是对这条回答我还有点疑问,“head指向的结构体内的其他指针仍然是空指针”,我用了语句
if(head->next==NULL)
printf("NULL");
else
printf("NO NULL");
进行判断,结果输出NO NULL,为什么?

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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