何时使用或何时不使用malloc函数

何时使用或何时不使用malloc函数在初学数据结构时,我们往往不太清楚在定义一个结构体指针时要不要使用malloc函数。例如以下的代码:LINKLIST*initlinklist(){LINKLIST*H=NULL;LINKLIST*S;intx;printf(“请输入链表元素或以-1结束输入”)while(x!=-1){s=(LINKLIST*

大家好,又见面了,我是你们的朋友全栈君。

在初学数据结构时,我们往往不太清楚在定义一个结构体指针时要不要使用malloc函数。
例如以下的代码:

LINKLIST  *init linklist()
{
    LINKLIST *H=NULL;
    LINKLIST *S;
    int x;
    printf("请输入链表元素 或以-1结束输入")
    while(x!=-1)
    {
    s=(LINKLIST*)malloc(sizeof(LINKLIST));
    s->data=x;
    s->next=H;
    H=s;
    scanf(%d,&x);
    }
retrun H;
}

在定义结构体指针变量S时需要用到malloc函数
而定义结构体指针变量H时则没有用到malloc函数
S和H的区别所在是:H没有指向有效地内存地址,而S指向了有效地内存地址,因为S指向了有效地内存地址所以可以往S指向的内存地址里面写值:S->data=x;而在后来H指向的地址就是每一个新的S指向的地址:H=S;
再举个例子

LINKLIST *S;
S->data=x;

以上这两句代码是不行的,因为S没有指向确切的地址,所以不能通过S来向它要指向的地址赋值;
但是

LINKLIST *S;
LINKLIST P;
S=&P;
S->data=x;

是可以的,因为S指向P的地址,S->data=x;等同于p.data=x;
而malloc的作用就类似以上代码的作用;但是不用再定义一个结构变量P,再让结构体指针变量S指向它的地址&P,而是直接使用malloc函数让结构体指针变量S指向一个确切的内存地址。

LINKLIST *s;
s=(LINKLIST*)malloc(sizeof(LINKLIST));
s->data=x;

再举一个简单的例子

int * i;
*i=1;

错误
而

int * i;i=(int*);
i=malloc(sizeof(int));
*i=1;

确是正确的

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/134101.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 数据库设计工具—–PD

    数据库设计工具—–PD数据库设计工具—–PDPowerDesign是一款功能强大的建模软件,提供强大的元数据管理功能,可以帮助用户构建关键信息的全方位视图,创建多种类型的模型,包括数据模型,物理模型,面向对象模型等等。同时继承了数据管理、BL、数据集成和数据整合多种功能。这是一款收费软件安装完成后,就来介绍一下基本使用。注意:这是一款功能非常非常非常强大的软件,我们只是介绍一下一小部分我们数据库用到的功能。进入软件后界面如下:我们点击file->然后创建一个model(模型)。然后创建一个物理

    2022年7月11日
  • SSM框架讲解(史上最详细的文章)[通俗易懂]

    SSM框架讲解(史上最详细的文章)[通俗易懂]SSM框架(白痴都看完都会)文章目录SSM框架(白痴都看完都会)介绍SSM框架<原理>一、什么是SSM框架?1.Spring2.SpringMVC3.Mybatis(核心是SqlSession)二、代码实战1.创建配置工程2.代码书写介绍SSM框架<原理>一、什么是SSM框架?SSM框架是spring、springMVC、和mybatis框架的整合,是标准的MVC模式。标准的SSM框架有四层,分别是dao层(mapper),service层,controller层

    2022年7月12日
  • 美化包软件_彩色音量进度条插件下载

    美化包软件_彩色音量进度条插件下载前言在我们进行自动化测试的时候,用例往往是成百上千,执行的时间是几十分钟或者是小时级别。有时,我们在调试那么多用例的时候,不知道执行到什么程度了,而pytest-sugar插件能很好解决我们的痛点。

    2022年7月28日
  • phpstorm2021.5激活激活码(最新序列号破解)

    phpstorm2021.5激活激活码(最新序列号破解),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
  • Antd的table筛选,表头columns的filters过滤清空

    Antd的table筛选,表头columns的filters过滤清空Form+Table实现了自定义筛选菜单的功能。具体可以参考https://ant.design/components/table-cn/#components-table-demo-custom-filter-panel。但是此功能会有bug:选择相应的搜索条件后,点击“搜索”按钮,Table会渲染相应的数据,且Table表头也有自带的过滤功能(实际上是column的filters属性起的作用);然后再点击“清除”按钮,所有的搜索条件和表头里filters过滤的条件都要被清除。但是Ta.

    2022年5月21日
  • Warning: file_put_contents(常用单词1.txt): failed to open stream: Invalid argument in

    Warning: file_put_contents(常用单词1.txt): failed to open stream: Invalid argument in

    2022年4月2日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号