何时使用或何时不使用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结束输入")
    whilex!=-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 *SS->data=x;

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

LINKLIST *SLINKLIST 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)
上一篇 2022年6月7日 下午12:36
下一篇 2022年6月7日 下午12:36


相关推荐

  • 利用Matlab对经典鸢尾花数据集实现决策树算法分类,并绘图

       最近在学习数据挖掘,其实决策树分类看过去好久了,但是最近慢慢的想都实现一下,加深一下理解。  知道决策树有很多现成的算法(ID3,C4.5、CART),但是毕竟核心思想就是那几点,所以本篇博客就是我随便实现的,没有参考现有的决策树算法。考虑到实现分类起码需要一个数据集,所以我选择了经典的鸢尾花数据集,下载地址:Iris   选择iris.data点击右键连接另存为,即可…

    2022年4月7日
    199
  • 使用 qrcodejs2 生成二维码详细API和参数

    使用 qrcodejs2 生成二维码详细API和参数使用 qrcodejs2 页面引入页面标签可以使 id 或者 ref 建议使 ref 因为使 vue 框架控制虚拟 Dom 才是正确的选择简单 便参数说明 OptionsEvent

    2026年3月17日
    2
  • STemWin显示图片

    STemWin显示图片目录一通过 BmpCvtST exe 软件将图片转换为 C 数组 然后通过 GUI DrawBitmapEx 函数显示二 STemWin 中 bmp jpg gif png 格式图片的相关接口函数三读取 SD 卡的 BMP 格式图片的数据 然后调用 GUI BMP DrawEx 函数 BMP 图片 四读取 SD 卡的 JPG 格式图片的数据 然后调用 GUI JPG DrawEx 函数 JPG 图片 五读取 SD 卡

    2025年10月1日
    7
  • 计算机补码运算

    计算机补码运算例如 如果你已经求出了 15 的补码这里有个简便的方法求 15 的补码 直接把 15 的补码包含符号位一起求反加 1 即可即 15 的原码 符号位 数值的二进制 0 0001111 0000 的反码 0000 的补码 00001111 正数的原码 反码 补码都是相同的 15 补码 nbsp 00001111 那么 15 的补码 nbsp

    2026年3月16日
    2
  • 用python生成随机数的几种方法「建议收藏」

    用python生成随机数的几种方法「建议收藏」今天学习了用python生成仿真数据的一些基本方法和技巧,写成博客和大家分享一下。本篇博客主要讲解如何从给定参数的的正态分布/均匀分布中生成随机数以及如何以给定概率从数字列表抽取某数字或从区间列表的某一区间内生成随机数,按照内容将博客分为3部分,并附上代码。1从给定参数的正态分布中生成随机数当考虑从正态分布中生成随机数时,应当首先知道正态分布的均值和方差(标准差),有了这些,…

    2022年10月5日
    4
  • Qwen3.5-27B服务管理教程:supervisor启停/日志排查/端口检测全流程

    Qwen3.5-27B服务管理教程:supervisor启停/日志排查/端口检测全流程

    2026年3月14日
    2

发表回复

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

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