.动态内存经典题分析(1)

2023-09-20 21:30:38


题目:

请问运⾏Test 函数会有什么样的结果?

void GetMemory(char *p)
{
  p = (char *)malloc(100);
}

void Test(void)
{
  char *str = NULL;
  GetMemory(str);
  strcpy(str, "hello world");
  printf(str);
}

int main()
{
  Test();
  return 0;
}

代码分析:

  1. 调用函数Test ,随后将char类型的指针str=NULL赋值
  2. 在Test中调用了GetMemory函数
  3. 在GetMemory函数中进行了申请空间一百个字节
  4. 又返回Test函数,进行strcpy将hello world这一串字符串拷贝到了空间str中
  5. 最后输出str

代码的本意:

将值是NULL的str调整,变为100字节的内存空间后,在进行拷贝,最后打印出字符串。

结果:程序崩溃

疑点:

  • 没有使用free进行释放申请的空间
  • printf(str)是否写错?

解答:

传参的错误!在普通变量的传参中,若使用指针则是将变量的地址传递给指针后,这个变量的内容会因为地址的传递,而在调用函数中的改变而发生改变。

而在这里,指针变量str传递的只是数值,并不是地址,若要改变str的值,则只能传递str的地址,因为不是传递地址的形式进行传参,这个参数会自己单独开辟一个空间进行调用函数内部的代码运行。

改代码就是如此。

而printf(str)其实是正确的打印方式,在打印的字符串的形式中有一种特殊的写法就是如此。

因为字符串在打印的过程中,其实是将字符串的收个字符的地址传递给了printf进行打印,所以当str是一个指针,且这个指针的值是一个字符串,那么这个指针实际指向的是字符串的首字符。

 

以上两种写法是一样的,都是正确的!

正确的代码演示:

void 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;
}

更多推荐

ruoyi-nbcio增加websocket与测试页面

为了后面流程发起等消息推送,所以需要集成websocket。1、后端增加websoket支持首先在framework模块里的pom.xml增加websocket<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-s

【用文心一言学习】MongoDB查询问题

说明:如下答案来自百度文心一言,已确定无误,请放心食用。1.MongoDB嵌套文档怎么查询在MongoDB中,可以使用嵌套文档来存储相关的数据。要查询嵌套文档,可以使用点符号(.)来引用嵌套字段。例如,假设你有一个名为users的集合,其中包含以下文档:[{"_id":1,"name":"John","address"

Python实战:用多线程和多进程打造高效爬虫

文章目录🍋引言🍋为什么要使用多线程和多进程?🍋线程的常用方法🍋线程锁(也称为互斥锁或简称锁)🍋小案例🍋实战---手办网🍋总结🍋引言在网络爬虫的世界里,效率是关键。为了快速地获取大量数据,我们需要运用一些高级技巧,如多线程和多进程。在本篇博客中,我们将学习如何使用Python的多线程和多进程来构建一个高效

c++ 归并排序

归并排序算法时间复杂度较为稳定,一般为nlogn,而快速排序受源数组排序影响较大,今天来学习归并排序。一.归并排序代码首先上代码:可以直接运行#include<bits/stdc++.h>usingnamespacestd;voidinsertsort(vector<int>&nums,intleft,intmid,i

中兴面试-Java开发

1、Springboot框架,yarn是怎么配置的SpringBoot本身没有直接的配置或集成与YARN(YetAnotherResourceNegotiator)的特性,YARN是Hadoop的一个资源管理和作业调度平台。如果你想在YARN上运行SpringBoot应用,你需要考虑将你的SpringBoot应用打包为

分布式AKF拆分原则

目录1前言2什么是AKF3如何基于AKFX轴扩展系统?4如何基于AKFY轴扩展系统?5如何基于AKFZ轴扩展系统?6小结1前言当我们需要分布式系统提供更强的性能时,该怎样扩展系统呢?什么时候该加机器?什么时候该重构代码?扩容时,究竟该选择哈希算法还是最小连接数算法,才能有效提升性能?在面对Scalability可伸缩性

大数据-玩转数据-Flink恶意登录监控

一、恶意登录对于网站而言,用户登录并不是频繁的业务操作。如果一个用户短时间内频繁登录失败,就有可能是出现了程序的恶意攻击,比如密码暴力破解。因此我们考虑,应该对用户的登录失败动作进行统计,具体来说,如果同一用户(可以是不同IP)在2秒之内连续两次登录失败,就认为存在恶意登录的风险,输出相关的信息进行报警提示。这是电商网

图解Raft协议

前言分布式系统设计中,在极大提高可用性、容错性的同时,带来了一致性问题(CAP理论),Raft协议就是解决分布式中的一致性问题。最近研究了Raft协议,谈谈自己对Raft协议的理解。希望这篇文章能够帮助大家理解。raft协议是什么?Raft协议是一种分布式一致性算法(共识算法),共识就是多个节点对某一个事件达成一致的算

网络编程套接字 | TCP套接字

前面的文章中我们使用UDP套接字编写了四个版本,不同的UDP服务器,在本文中我们将要对TCP套接字进行几个不同的版本的代码的编写,首先测试一下TCP套接字的代码,然后是将这个版本进行修改成多进程版本的,再将代码修改成多线程版本的,最后在编写一个线程池版本的代码。在编写TCP套接字之前我们会使用如下的一些APIsocke

QT基础教程(QT中的文件操作)

文章目录前言一、文件操作方法二、QFileInfo类四、QTemporaryFile类总结前言本篇文章我们来讲解QT中的文件操作,文件操作对于QT来说是非常重要的一个点,那么下面的话将给大家详细的讲解QT中的文件操作。一、文件操作方法在QT中,文件操作是通过Qt的文件和目录处理类来完成的。以下是一些常用的文件操作功能:

FLASK中的鉴权的插件Flask-HTTPAuth

在Web应用中,我们经常需要保护我们的api,以避免非法访问。比如,只允许登录成功的用户发表评论等。Flask-HTTPAuth扩展可以很好地对HTTP的请求进行认证,不依赖于Cookie和Session。本文主要介绍两种认证的方式:基于密码和基于令牌(token)。1、安装$pipinstallFlask-HTTPA

热文推荐