C malloc经典面试题解答与分析

本篇博客介绍关于C malloc经典的错误代码写法以及解决方法。

题目1

错误的代码:

#include <iostream>void test01(char* p)
{p = (char*)malloc(10);
}int main1()
{char* p = NULL;test01(&p);const char* str = "hello";strcpy(p, str);printf("p= %s", p);free(p);return 0;
}

运行结果
在这里插入图片描述
出现这种现象,是因为在函数 test01 中,p = (char*)malloc(10); 只是改变了局部变量 p 的值,而不会影响 main 函数中 p 的值,因为 p 是按值传递的。换句话说,main 函数中的 p 仍然是 NULL。修改如下:

void test02(char** p)
{*p = (char*)malloc(10);// 在 malloc 后没有检查是否分配成功。if (*p == NULL){fprintf(stderr, "Memory allocation failed\n");exit(1);}
}

将 test01 函数的参数改为 char**,以便通过指针传递并修改 main 中的 p。在 malloc 后添加了内存分配检查,确保内存分配成功。

题目2

错误的代码如下:

#include <iostream>char* GetMemory()
{char p[] = "hello world";return p;
}int main()
{char* str = NULL;str = GetMemory();printf(str);return 0;
}

运行结果如下:
在这里插入图片描述
在打印str时,输出的并不是“hello world”,这段C++代码存在一个主要的问题:GetMemory 函数返回了一个指向局部变量的指针。局部变量在函数返回后就会被销毁,因此返回指向它们的指针是无效的,会导致未定义行为。
修改如下:

#include <iostream>char* GetMemory()
{const char* temp = "hello world";// 动态分配内存char* p = (char*)malloc(strlen(temp) + 1);if (p != NULL){strcpy(p, temp);}return p;
}int main()
{char* str = GetMemory();if (str != NULL){printf("%s\n", str);// 释放动态分配的内存free(str);}else{std::cerr << "Memory allocation failed" << std::endl;}return 0;
}

输出结果:
在这里插入图片描述
上面的代码将 GetMemory 函数改为动态分配内存并返回一个指向动态分配内存的指针。此外,还要确保在 main 函数中释放分配的内存以避免内存泄漏。

另外,在malloc后,尽量加if判断申请的内存是否成功。

题目3

两数交换,错误的代码如下:

#include <iostream>void swap(int* p1, int* p2)
{int* p = NULL;*p = *p1;*p1 = *p2;*p2 = *p;
}int main()
{int a = 100;int b = 200;swap(&a, &b);printf("a = %d, b = %d\n", a, b);return 0;
}

运行结果:
在这里插入图片描述
在swap函数中,p是一个“野”指针,有可能指向系统区,导致程序运行的崩溃。正确的写法如下:

void swap(int* p1, int* p2)
{int p;p = *p1;*p1 = *p2;*p2 = p;
}

题目4

将字符串中的小写字母
写法一:
使用标准库函数toupper将小写字母转换为大写字母

#include <stdio.h>
#include <ctype.h>void ToUpper(char* str)
{// 遍历字符串中的每个字符while (*str){// 使用标准库函数toupper将小写字母转换为大写字母*str = toupper((unsigned char)*str);str++;}
}int main()
{char str[] = "Hello, World! This is a test.";printf("Original string: %s\n", str);ToUpper(str);printf("Uppercase string: %s\n", str);return 0;
}

写法二:
通过检查字符的ASCII码值来手动转换小写字母为大写字母。小写字母的ASCII码值范围是97到122(即’a’到’z’),而大写字母的ASCII码值范围是65到90(即’A’到’Z’)。通过减去32,可以将一个小写字母转换为对应的大写字母。

#include <stdio.h>void ToUpper(char* str)
{// 遍历字符串中的每个字符while (*str){// 如果当前字符是小写字母if (*str >= 'a' && *str <= 'z'){// 将其转换为大写字母*str = *str - ('a' - 'A');}str++;}
}int main()
{char str[] = "Hello, World! This is a test.";printf("Original string: %s\n", str);ToUpper(str);printf("Uppercase string: %s\n", str);return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 线程的同步与互斥

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux初窥门径⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d; 前言 1.资源共享问题 2.进程线程间的互斥…

C语言程序设计-7 数组

在程序设计中&#xff0c;为了处理方便&#xff0c;把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在&#xff23;语言中&#xff0c;数组属于构造数据类型。一个数 组可以分解为多个数组元素&#xff0c;这些数组元素可以是基本数…

晶体振荡电路中的负性阻抗是什么?-晶发电子

在理想的振荡电路中&#xff0c;为了保持振荡的稳定性和强度&#xff0c;需要一种机制来补偿晶振振动过程中的能量损耗。在实际应用中&#xff0c;这种能量损耗是不可避免的&#xff0c;它可能导致振荡逐渐衰减直至停止。为了解决这个问题&#xff0c;振荡电路设计者采用了一种…

公司怎么管理文档外发泄密?强化企业文档安全用迅软加密软件就行了!

一、文档加密软件原理 迅软DSE加密软件对各类需要加密的文件&#xff08;如&#xff1a;技术资料、商业数据、红头文件、会议纪要、机要文件、图纸、财务报表等&#xff09;进行加密。 使用加密算法对文件自动加密&#xff0c;只有拥有正确的解密密钥或密码的人才能打开文件&…

语言模型测试系列【10】

一个巧合&#xff0c;又测到了新的区别&#xff0c;以下是关于python代码生成的测试效果。 语言模型 文心一言讯飞星火通义千问2.5豆包360智脑百小应腾讯元宝KimiC知道商量智谱清言 这次的测试问题来源于**智谱AI开放平台**的介绍&#xff0c;正好有个python生成的效果说明…

韩顺平0基础学java——第28天

p569-591 坦克大战&#xff01;&#xff08;绘图监听事件线程文件处理&#xff09; 绘图 绘图原理 Component类提供了两个和绘图相关最重要的方法: 1. paint(Graphics g)绘制组件的外观 2. repaint()刷新组件的外观。 当组件第一次在屏幕显示的时候,程序会自动的调用paint()…

智能网联汽车实训教学“好帮手”——渡众机器人自动驾驶履带车

智能网联汽车实训教学“好帮手”——渡众机器人自动驾驶履带车 人工智能技术的兴起&#xff0c;为传统汽车行业注入了强有力的变革基因&#xff0c;以AI技术为驱动的无人驾驶成为汽车产业的未来&#xff0c;同样也面临诸多机遇和挑战。 一方面智能网联汽车的发展&#xff0c;为…

GD32学习

参考视频13.立创开发板GD32教程&#xff1a;串口配置_哔哩哔哩_bilibili 固件库跟用户手册基本上差不多&#xff0c;只不过用用户手册编写程序的话会更加的底层&#xff0c;固件库的话就是把一些函数封装起来&#xff0c;用的时候拿过来即可&#xff0c;目前我还没有找到固件库…

【数据库备份完整版】物理备份、逻辑备份,mysqldump、mysqlbinlog的备份方法

【数据库备份完整版】物理备份、逻辑备份&#xff0c;mysqldump、mysqlbinlog的备份方法 一、物理备份二、逻辑备份1.mysqldump和binlog备份的方式&#xff1a;2.mysqldump完整备份与恢复数据2.1 mysqldump概念2.2 mysqldump备份2.3 数据恢复2.4 **使用 Cron 自动执行备份**2.5…

linux下编译安装和使用cURL库(含有openssl)

cURL是一个利用URL语法指定各种协议(如HTTP、HTTPS、FTP等)进行数据传输的工具,它以客户端的身份,允许用户通过命令行与服务器交互。cURL库(libcurl)是cURL的编程接口(API),提供了一套丰富的函数,供开发者在自己的应用程序中实现网络传输功能 cURL库是网络编程中不可…

搭建一个简单的xxljob

数据库表结构&#xff1a; YyJobInfo&#xff1a; public class YyJobInfo {//定时任务idprivate int id;//该定时任务所属的执行器的idprivate int jobGroup;//定时任务描述private String jobDesc;//定时任务添加的时间private Date addTime;//定时任务的更新时间private D…

服务器权限管理

我们linux服务器上有严格的权限等级&#xff0c;如果权限过高导致误操作会增加服务器的风险。所以对于了解linux系统中的各种权限及要给用户&#xff0c;服务等分配合理的权限十分重要。&#xff08;权限越大&#xff0c;责任越大&#xff09; 1.基本权限 U--user用户,G-group…

智谱API调用

一、智谱API 文心一言api 千帆大模型平台 申请和使用 智谱AI开放平台 登录智谱AI开放平台&#xff0c;点击右上角的开发者工作台&#xff0c;然后查看自己的API glm-4 接口 conda create -n zhipuai python3.10 -y 二、如何使用 这边的介绍是根据官方文档的接口文档来进行介绍…

深度学习之绘图基础

文章目录 1.实验目的2. 需求3.代码结果图片 1.实验目的 熟练绘制各种图像&#xff0c;为深度学习打基础 2. 需求 给定一个函数&#xff0c;需要你画出原图像以及这个函数在某点切线图像 3.代码 # File: python绘制函数图像以及倒数图像.py # Author: chen_song # Time: 20…

绽放光彩的小程序 UI 风格

绽放光彩的小程序 UI 风格

vivado WIRE

WIRE是用于在Xilinx部件上路由连接或网络的设备对象。一根电线 是单个瓦片内部的一条互连金属。PIP、系紧装置和 SITE_PINs。 提示&#xff1a;WIRE对象不应与设计的Verilog文件中的WIRE实体混淆。那些 电线在设计中与网络有关&#xff0c;而不是与定义的设备的路由资源有关 WI…

创业众筹网

摘 要 创业是社会经济发展的重要动力&#xff0c;其在任何经济发展时期任何国家都最具活力与桃战性。然而创业的资金却是90%创业者面临的首要问题。包括积蓄不足、无不动产、负债、不知如何向银行申贷,及无法预估所创行业之总资金、成本。部分创业者虽然有心创业&#xff0c;但…

AI创作音乐引发的深思

在最近一个月中&#xff0c;音乐大模型的迅速崛起让素人生产音乐的门槛降到了最低。这一变革引发了关于AI能否彻底颠覆音乐行业的广泛讨论。在初期的兴奋过后&#xff0c;人们开始更加理性地审视AI在音乐领域的应用&#xff0c;从版权归属、原创性、创作质量、道德层面以及法律…

【读论文】Learning perturbations to explain time series predictions

文章目录 Abstract1. Introduction2. Background Work3. Method4. Experiments4.1 Hidden Markov model experiment4.2 MIMIC-III experiment 5. ConclusionReferences 论文地址&#xff1a;Learning Perturbations to Explain Time Series Predictions代码地址&#xff1a;htt…

深度学习Week17——优化器对比实验

文章目录 深度学习Week17——优化器对比实验 一、前言 二、我的环境 三、前期工作 1、配置环境 2、导入数据 2.1 加载数据 2.2 检查数据 2.3 配置数据集 2.4 数据可视化 四、构建模型 五、训练模型 1、将其嵌入model中 2、在Dataset数据集中进行数据增强 六、模型评估 1、Accur…