C语言学习(三十五)---动态内存练习题与柔性数组

经过前面的内容,我们已经对动态内存的知识已经有了相当多了了解,今天我们再做几道有关动态内存的练习题,然后再介绍一下柔性数组,好了,话不多说,开整!!!

动态内存练习题

题目分析

先自行分析以下代码,分析错误在哪以及运行结果,然后再查看解析:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char* GetMemory(char* p)
{
    p = (char *)malloc(100);
}
void Test(void)
{
    char *str = NULL;
    GetMemory(str);
    strcpy(str,"hello world");
    printf(str);
    free(str);
    str = NULL; 
}
int main()
{
    Test();
    return 0;
}

自行分析完毕后,再来查看该部分分析:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char* GetMemory(char* p)
{
    p = (char *)malloc(100);//2、向动态内存申请100个字节的空间,然后返回一个char*的指针变量
    return p;//返回该指针
}
void Test(void) //1、进入该函数
{
    char* str = NULL;  //定义一个空的字符指针,str为一个值
    GetMemory(str);//进入该自定义函数 :由于此处传入的非地址,因此,内部的操作在退出GetMemory函数后
    // 会自动销毁,因此申请无效,并且申请的动态内存未销毁
    strcpy(str,"hello world");//3、走出上一个自定义函数,进行字符串拷贝
    //此处进行拷贝,由于并没有申请成功,str仍为空指针,因此程序崩溃
    printf(str);//打印内容 :没有拷贝成功,因此,也不会打印出结果
    free(str);//释放空间 :释放空指针所在的空间,
    //没有置空
}
int main()
{
    Test();//执行到此处,进入自定义函数Test
    return 0;
}

所以程序会崩溃,运行结果如下:
在这里插入图片描述
同样在Linux下可以更明显的看到该错误:
在这里插入图片描述

题目改正

在前面的内容中我们讲到过:如果想在自定义函数的内部操作,影响外部的值,则需要传址

因此我们此时传入str的地址,既然传入的为一个地址,那么接收就应该为二级指针char**

既然是向动态内存申请空间并要使用,那我们就直接解引用p,最后再对动态内存进行置空,因此,改正代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char* GetMemory(char** p)
{
    *p = (char *)malloc(100);
}  
void Test(void) 
{
    char* str = NULL; 
    GetMemory(&str);
    strcpy(str,"hello world");
    printf(str);
    free(str);
    str = NULL; 
}
int main()
{
    Test();
    return 0;
}

查看结果,发现结果正确:
在这里插入图片描述

柔性数组

这个概念,其实很多人都是第一次听说,我们之前学习过数组,那么柔性数组是什么呢,

当在定义的结构体中,最后一个元素的大小是未知的,可以根据使用需要自行开辟

这样所定义的就是柔性数组,从概念中可以看到,这我们学的动态内存有些相似之处都是可以根据需要调整所用的空间

其用法为:

结构体指针 p = (结构体指针)malloc(结构体空间 + 自定义空间)

比如以下代码:

#include<stdio.h>
#include<stdlib.h>
struct test
{
    int a;
    int arr[];
};
int main()
{
    struct test* p = (struct test*)malloc(sizeof(struct test) + 40);
    int i = 0;
    if (p == NULL)
    {
        return 0;
    }
    else
    {
    for(i=0;i<10;i++)
    {
        p->arr[i] = i;
        printf("%d ",p->arr[i]);
    }
    }
    free(p);
    p = NULL;
    return 0;
}

在上述的代码中,我们就声明了一个柔性数组,然后申请了40字节的空间,进行赋值,编译结果如下:
在这里插入图片描述
当然了,在后续的使用,也可以使用realloc函数进行空间再调整

除了上述的方式外,也有另一种方式,直接再结构体的最后一个元素定义一个指针,然后用指针指向一片待开辟的空间,也可以实现这个功能,代码如下:

#include<stdio.h>
#include<stdlib.h>
struct test
{
    int a;
    int* arr;
};
int main()
{
    struct test* p = (struct test*)malloc(sizeof(struct test));
    int i = 0;
    p->arr = malloc(5*sizeof(int));//申请5个整型空间给数组指针arr
    if ( p == NULL)
    {
        return 0;
    }
    else
    {
        for(i=0;i<5;i++)
        {
            p->arr[i] = i;
            printf("%d ",p->arr[i]);
        }
    }
    free(p->arr);
    p->arr = NULL;
    free(p);
    p = NULL;
    return  0;
}

在上述的代码中,我们就是用另外一种方式实现了柔性数组的功能,但是可以看到,在释放动态内存时,需要分两次释放先释放数组指向的动态内存,再释放p指向的动态内存空间,因此,在使用中,容易产生错误

不推荐大家使用。

上述内容即使今天的全部内容了,感谢大家的观看。
如果方便,辛苦大家点个赞和关注哦!
您的点赞或评论或关注是对我最大的肯定,谢谢大家!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/35389.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【真题解析】系统集成项目管理工程师 2021 年上半年真题卷(案例分析)

本文为系统集成项目管理工程师考试(软考) 2021 年上半年真题&#xff08;全国卷&#xff09;&#xff0c;包含答案与详细解析。考试共分为两科&#xff0c;成绩均 ≥45 即可通过考试&#xff1a; 综合知识&#xff08;选择题 75 道&#xff0c;75分&#xff09;案例分析&#x…

Pycharm使用Anoconda配置虚拟环境

目录 1.Anoconda的介绍 2.Anaconda的作用 3.Anaconda的安装 4.Anaconda的配置 4.1添加镜像源 4.2创建、使用并切换虚拟环境 5.pycharm的集成 1.Anoconda的介绍 Anaconda是一个可用于科学计算的 Python 发行版&#xff0c;可以便捷获取和管理包&#xff0c;同时对环境进行…

Docker 常用指令集合,更换镜像(Ubantu)

1.更换镜像 先进入root用户 cat /etc/docker/daemon.json 查看有没有镜像创建目录,创建并编辑damon,json文件 mkdir -p /etc/docker vim /etc/docker/daemon.json# 填写内容 {"registry-mirrors": ["https://h5rurp1p.mirror.aliyuncs.com"] } 重新启…

postgresql(一):使用psql导入数据库

使用psql导入数据库 1、概述2、具体问题3、总结 1、概述 大家好&#xff0c;我是欧阳方超。 听说postgresql越来越流行了&#xff1f;psql是一个功能强大的命令行工具&#xff0c;用于管理和操作PostgreSQL数据库。它提供了一个交互式环境&#xff0c;允许用户执行SQL查询、创…

PyTorch示例——ResNet34模型和Fruits图像数据

PyTorch示例——ResNet34模型和Fruits图像数据 前言导包数据探索查看数据集构建构建模型 ResNet34模型训练绘制训练曲线 前言 ResNet34模型&#xff0c;做图像分类数据使用水果图片数据集&#xff0c;下载见Kaggle Fruits Dataset (Images)Kaggle的Notebook示例见 PyTorch——…

部署 CNI网络组件

部署 flannel K8S 中 Pod 网络通信&#xff1a; ●Pod 内容器与容器之间的通信 在同一个 Pod 内的容器&#xff08;Pod 内的容器是不会跨宿主机的&#xff09;共享同一个网络命令空间&#xff0c; 相当于它们在同一台机器上一样&#xff0c;可以用 localhost 地址访问彼此的端…

requests---jsonpath在接口自动化中的应用

目录 前言 jsonpath 通过下标提取 通过jsonpath提取 jsonpath的其他用法 通过$获取属性值内容 通过【*】获取对应值 通过切片获取对应值 总结 前言 我们在做接口测试时&#xff0c;大多数返回的都是json属性&#xff0c;我们需要通过接口返回的json提取出来对应的值&am…

浏览器种输入一个url到显示页面全过程

原文合集地址如下&#xff0c;有需要的朋友可以关注 本文地址 合集地址 所谓的‘三颗树’ 在浏览器中&#xff0c;当解析和加载网页时&#xff0c;会形成三个重要的树结构&#xff1a;DOM树、CSSOM树和渲染树&#xff08;Render Tree&#xff09;。这些树结构在网页的渲染和…

基于SQLI的SQL字符型报错注入

基于SQLI的SQL字符型报错注入 一. 实验目的 理解数字型报错SQL注入漏洞点的定位方法&#xff0c;掌握利用手工方式完成一次完整SQL注入的过程&#xff0c;熟悉常见SQL注入命令的操作。 二. 实验环境 渗透主机&#xff1a;KALI平台 用户名: college 密码: 360College 目标网…

web安全php基础_php数据类型

PHP 数据类型 PHP 支持以下几种数据类型: String&#xff08;字符串&#xff09;Integer&#xff08;整型&#xff09;Float&#xff08;浮点型&#xff09;Boolean&#xff08;布尔型&#xff09;Array&#xff08;数组&#xff09;Object&#xff08;对象&#xff09;NULL&…

算法----Nim 游戏

题目 你和你的朋友&#xff0c;两个人一起玩 Nim 游戏&#xff1a; 桌子上有一堆石头。 你们轮流进行自己的回合&#xff0c; 你作为先手 。 每一回合&#xff0c;轮到的人拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。 假设你们每一步都是最优解。请编写一个函数&a…

Kubernetes 启动Pod的方法-Pod的调度算法-Pod间的通信-k8s的控制器-Pod资源控制-发布Service服务

目录 Pod 参考文档&#xff1a;Pod | Kubernetes Pod配置文件&#xff1a;simple-pod.yaml 对master进行如下操作 Pod的状态有&#xff1a; 参考文档&#xff1a;(70条消息) Pod生命周期中的状态解释_pod状态_闹玩儿扣眼珠子的博客-CSDN博客 进入Pod内的nginx容器&#…

Linux快速搭建Java环境

1. 安装JDK运行与调试 搭建Java环境 1. 安装JDK 打开命令行执行 sudo apt install default-jdk 有确定的选项直接y就行 安装拓展: 1 . 有时候vscode会自动弹出消息叫你安装拓展,直接点击全部安装就行了 2 . 未弹出或安装失败解决: 打开拓展搜索,把下面的,全部安装就行 这样就可…

Nginx(6)nginx的缓存集成

缓存集成 Nginx缓存集成缓存的概念Nginx的web缓存服务 缓存设置的相关指令Nginx缓存设置案例 Nginx缓存的清除Nginx设置资源不缓存 Nginx缓存集成 缓存的概念 缓存就是数据交换的缓冲区(称作Cache)&#xff0c;当用户要获取数据的时候&#xff0c;会先从缓存中去查询获取数据…

TikTok将在10月份之前免除佣金并提供补贴!

TikTok 因其便捷的结账方式越来越吸引美容品牌&#xff0c;Elf Beauty Laura Mercier、BareMinerals KimChi Chic Beauty 和 Skin Gym 等美容品牌已经接受了社交网络的结账功能。在这种情况下&#xff0c;该工具允许消费者将多个品牌的产品添加到应用内购物车中。 在巴西&…

动态路由,微信小程序绑定

■登录成功之后添加动态路由 ●登录的时候会获取到它的菜单配置■动态路由 | Vue Router <view wx:for"{{list}}">{{index}}--- {{item.name}} </view><view wx:for"{{list}}" wx:for-item "ttt" wx:for-index"num"&…

(02)Cartographer源码无死角解析-(79) ROS服务→子图压缩与服务发送

讲解关于slam一系列文章汇总链接:史上最全slam从零开始&#xff0c;针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解&#xff1a;https://blog.csdn.net/weixin_43013761/article/details/127350885 文…

机器学习——掌握决策树ID3算法的原理,通过增益熵实现手工推导的过程。

文章目录 决策树介绍优缺点ID3算法原理举例 决策树的构建1、特征选择&#xff08;1&#xff09;香农熵&#xff08;2&#xff09;信息增益 2、决策树的生成3、决策树的修剪 总结&#xff1a;参考文献 决策树 介绍 决策树(decision tree)是一种基本的分类与回归方法。ID3是其中…

Linux学习之分区和挂载磁盘配额

先分区然后格式化。 fdisk /dev/sdb开始分区。 输入p&#xff0c;然后按下Enter&#xff0c;可以查看当前设备的分区情况。 输入d&#xff0c;然后按下Enter&#xff0c;就可以删除上边的分区&#xff0c;要是有多个分区&#xff0c;会让你选择删除哪个分区。 输入n&…

mysql基础5——mysql主从

文章目录 一、基本了解二、主从原理三、主从复制3.1 从无到有3.1.1 服务器初始化3.1.2 配置主库3.1.3 配置从库3.1.4 效果验证 3.2 从有到无3.2.1 主库全备&#xff0c;并同步到从库3.2.2 配置主库3.2.3 配置从库3.2.4 效果验证 四、数据库运维4.1 几个参数4.2 查看进程列表 一…