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.mfbz.cn/a/730653.html

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

相关文章

基于STM32的智能温室控制系统

目录 引言环境准备智能温室控制系统基础代码实现&#xff1a;实现智能温室控制系统 4.1 温湿度传感器数据采集4.2 光照传感器数据采集4.3 控制系统实现4.4 用户界面与数据可视化应用场景&#xff1a;智能温室管理与优化问题解决方案与优化收尾与总结 1. 引言 智能温室控制系…

Nodejs 第七十九章(Kafka进阶)

kafka前置知识在上一章讲过了 不再复述 kafka进阶 1. server.properties配置文件 server.properties是Kafka服务器的配置文件&#xff0c;它用于配置Kafka服务的各个方面&#xff0c;包括网络设置、日志存储、消息保留策略、安全认证 #broker的全局唯一编号&#xff0c;不能…

Ubuntu系统如何配置通过图形界面登录root用户

Ubuntu系统中的root账号默认是锁定的&#xff0c;但可以通过设置密码来启用。 需要注意的是&#xff0c;由于root用户具有对系统完全控制的权限&#xff0c;因此在使用root账户时应格外小心。一个错误的命令可能会导致系统损坏&#xff0c;这就是为什么Ubuntu默认不启用root账户…

[SAP ABAP] 变量与常量

1.变量 定义变量的基本方式 DATA <name> TYPE <type> [VALUE <val>]. <name>&#xff1a;指定变量的名称 <type>&#xff1a;指定变量的数据类型 <val>&#xff1a;指定<name>的初始值 示例1 定义变量lv_data1和lv_data3 输出结果…

qt 简单实验 画一个等边三角形

1.概要 2.代码 2.1 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPainter>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr)…

U盘文件夹损坏0字节:现象解析、恢复方法与预防措施

在日常工作和生活中&#xff0c;U盘因其便携性和大容量成为我们存储和传输数据的重要工具。然而&#xff0c;当U盘中的文件夹突然损坏并显示为0字节时&#xff0c;我们可能会感到困惑和焦虑。本文将对U盘文件夹损坏0字节的现象进行详细描述&#xff0c;分析其可能的原因&#x…

python基础篇(3):print()补偿知识点

1 print输出不换行 默认print语句输出内容会自动换行&#xff0c;如下&#xff1a; print("hello") print(" world") 结果&#xff1a; 在print语句中&#xff0c;加上 end’’ 即可输出不换行了 print("hello",end) print(" world&quo…

pywinauto入门指南:轻松掌握Windows GUI自动化

pywinauto库概述: pywinauto是一个Python库,主要用于自动化Windows应用程序的GUI测试和操作.它提供了一组简单而强大的API,可以模拟用户与Windows应用程序的交互,包括点击按钮、输入文本、选择菜单等操作. 安装 ##pywinauto可以通过pip进行安装,打开命令行运行: pip install…

逻辑回归(Logistic Regression)及其在机器学习中的应用

&#x1f680;时空传送门 &#x1f50d;逻辑回归原理&#x1f4d5;Sigmoid函数&#x1f388;逻辑回归模型 &#x1f4d5;损失函数与优化&#x1f388;损失函数&#x1f680;优化算法 &#x1f50d;逻辑回归的应用场景&#x1f340;使用逻辑回归预测客户流失使用scikit-learn库实…

计算机网络 VLAN间路由单臂路由

一、理论知识 VLAN是一种将物理网络划分成多个逻辑网络的方法。不同的VLAN属于不同的网段&#xff0c;因此互相通信需要通过路由器进行路由。通常情况下&#xff0c;在同一VLAN内的设备可以直接通信&#xff0c;而不同VLAN之间的设备则需要通过路由器转发数据。本实验利用单臂…

HTTP性能测试工具-wrk

wrk性能测试工具详解 wrk是一款轻量级但功能强大的HTTP基准测试工具&#xff0c;主要用于在单机多核CPU环境下对HTTP服务进行性能测试。它通过利用系统自带的高性能I/O机制&#xff08;如epoll、kqueue等&#xff09;&#xff0c;结合多线程和事件模式&#xff0c;能够产生大量…

FPGA开发Vivado安装教程

前言 非常遗憾的一件事情是&#xff0c;在选修课程时我避开了FPGA&#xff0c;选择了其他方向的课程。然而&#xff0c;令我没有想到的是&#xff0c;通信项目设计的题目竟然使用FPGA&#xff0c;这简直是背刺。在仅有的半个月时间里&#xff0c;准备这个项目确实是非常紧张的…

c++里对 new 、delete 运算符的重载

&#xff08;1&#xff09;c 里 我们可以用默认的 new 和 delete 来分配对象和回收对象。 new 可以先申请内存&#xff0c;再调用对象的构造函数&#xff1b; delete 则先调用对象的析构函数&#xff0c;再回收内存。当然&#xff0c;当我们为类定义了 operator new () 和 oper…

千年古城的味蕾传奇-平凉锅盔

在甘肃平凉这片古老而神秘的土地上&#xff0c;有一种美食历经岁月的洗礼&#xff0c;依然散发着独特的魅力&#xff0c;那便是平凉锅盔。平凉锅盔&#xff0c;那可是甘肃平凉的一张美食名片。它外表金黄&#xff0c;厚实饱满&#xff0c;就像一轮散发着诱人香气的金黄月亮。甘…

高通Android 12 aapt报错问题踩坑

背景 最近因为要做多module模块&#xff0c;出现aapt报错&#xff0c;于是简单记录下&#xff0c;踩坑过程。 1、我一开始项目中三个module&#xff0c;然后在build.gradle设置androidApplication plugins {alias(libs.plugins.androidApplication) }2、运行完之后都是报下面…

当flex-direction: column时,设置flex:1不生效解决办法

当需求是: 页面纵向排列,且最后一个元素撑满剩余高度 flex:1在横向排列时是可以的,但是纵向排列会失效,此时需要给最后一个子元素设置align-self: stretch;即可撑满剩余高度 <div class"father"><div class"child child1"></div><div…

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

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

客户集中度高,毛利率下滑,江苏永成的IPO之路能走通吗?

撰稿|行星 来源|贝多财经 近年来&#xff0c;汽车市场蓬勃向上&#xff0c;助推上游配套产业链进入增长热潮。 行业利好前景下&#xff0c;不少汽车上游供应商开始向资本市场进发&#xff0c;希望借助上市拓宽融资渠道&#xff0c;加速业务拓展和技术创新&#xff0c;在产业…

【单片机毕业设计选题24019】-基于STM32的安防监测灭火系统

系统功能: 1. 水泵喷水灭火功能&#xff1a;当火焰传感器监测到火焰时&#xff0c;蜂鸣器报警&#xff0c;水泵工作实现灭火。 2. 风扇功能&#xff1a;当烟雾传感器检测到CO或温度传感器检测到温度超过阈值时&#xff0c;蜂鸣器报警&#xff0c; 启动风扇进行驱散烟雾或降温…

椭圆的几何要素

椭圆的几何要素 flyfish 椭圆的方程为 x 2 a 2 y 2 b 2 1 \frac{x^2}{a^2} \frac{y^2}{b^2} 1 a2x2​b2y2​1。 长半轴 a a a&#xff08;绿色虚线&#xff09;和短半轴 b b b&#xff08;紫色虚线&#xff09;。 焦点 F 1 ( − c , 0 ) F1(-c, 0) F1(−c,0)&#…