首页 > 系统相关 >编程之路,从0开始:动态内存笔试题分析

编程之路,从0开始:动态内存笔试题分析

时间:2024-11-22 13:43:31浏览次数:3  
标签:笔试 动态内存 编程 char str world include GetMemory 指针

       Hello大家好,很高兴我们又见面啦!

       给生活添点passion,开始今天的编程之路。

今天我们来看几个经典的动态内存笔试题。


1、题目1

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

       程序没有输出结果。

       首先,printf(str)应该是打印出存放在str这个位置的字符串,我们想让他输出一个字符串,但是为什么没输出呢?

       其实是这里的内存开辟有问题。

       我们在进入函数时,创建了一个形参指针变量,开辟的时候也是在我们的形参那里开辟的,而我们的形参不会影响实参。也就是说,我们真正存放字符串的地址仍然是NULL。那么在strcpy的时候就不可避免地解引用空指针这个错误归根结底还是解引用了空指针(上一篇介绍过)。

图片理解:

1d86c7b92e9748289bd59aa48de61262.png

解决办法

       我们想一下,既然要开辟实参那里的地址,那么是不是需要让开辟的时候从str那开辟呢?

       现在问题就成了怎么从str那开始开辟。回想指针初识篇的传址调用,是不是在进入函数之后对形参进行了解引用操作呢?那我们现在也对形参进行解引用,让形参解引用之后指向str不就好了吗?

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

       这里我们就运用了二级指针,我们把str这个指针的地址传过去,那么解引用二级指针不就指向了str这个指针吗?

图片理解:

405447be5e65435f94cee9dcbbc68c7c.png


2、题目2

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
char * GetMemory(void)
{
	char p[] ="Hello world";
	return p;
}
int main()
{
	char* str = NULL;
	str = GetMemory();
    printf(str);
	return 0;
}

运行结果:

358c52e84dd84ee3af039ca2e742fa46.png

       这个题目的错误就在于忽略了变量的生命周期(这部分知识在补充篇详细讲解过)。我们的确把字符串存放在了p这个数组里,但是当出函数后,这个p地址里存放的内容就消失了,所以打印出来是一堆乱码。


3、题目3

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
	char* str = (char*)malloc(100);
	strcpy(str, "hello");
	free(str);
	if (str != NULL)
	{
		strcpy(str, "world");
		printf(str);
	}
	return 0;
}

运行结果:

4bf9381c0e1142bc85614a86b2507698.jpg

 注:这里拿手机编译器运行了一下

       虽然这个程序正常打印里,但实际上他是有问题的。我们提前释放了内存,导致这一百个字节的空间不是我们的了,那么这时候我们再去放入world就属于是非法访问了。那这个地能访问吗?还真能,他还真往里面放了个world并且打印出来了。但实际上这种写法是有问题的,所以千万别这样写。

       好了,今天的内容就分享到这,觉得有帮助的还请点点关注支持一下,我们下次再见!

 

 

标签:笔试,动态内存,编程,char,str,world,include,GetMemory,指针
From: https://blog.csdn.net/2401_87995839/article/details/143970491

相关文章

  • 深入解析 JUC 并发编程:CountDownLatch 与 CyclicBarrier 的原理、应用与最佳实践
    1.引言1.1什么是JUC并发编程?在Java开发中,并发编程是提升程序性能、优化资源利用的核心技术之一。Java提供了强大的并发工具库,JUC(JavaUtilConcurrent)便是其中的精髓所在。JUC不仅包含了线程池、锁等基础组件,还为开发者提供了一系列同步工具类,方便实现线程间的协调与管......
  • [python] Python异步编程库asyncio使用指北
    Python的asyncio模块提供了基于协程(coroutines)的异步编程(asynchronousprogramming)模型。作为一种高效的编程范式,异步编程允许多个轻量级任务并发执行,且相比传统的多线程模型,具有更低的内存消耗。因此,asyncio在需要高并发处理的场景中,尤其是在Web开发、网络请求、API调用和套接字......
  • Linux串口应用编程:从UART到GPS模块及字符设备驱动
    往期内容本专栏往期内容:Uart子系统UART串口硬件介绍深入理解TTY体系:设备节点与驱动程序框架详解interrupt子系统专栏:专栏地址:interrupt子系统Linux链式与层级中断控制器讲解:原理与驱动开发–末片,有专栏内容观看顺序pinctrl和gpio子系统专栏:专栏地址:pinctrl和gpio......
  • ABB freelance下使用ST编程计算日均值
    最近现场需要在ABBDCS上做日均值计算,从前一天上午8点到第二天上午7点59分59秒,一秒一个数据,最后求日均值。freelance自定义功能块对数组总的元素个数有一个限制,无论是组态模拟控制器,还是组态实际控制器,我在做练习的时候遇见过,于是就减少总的数组元素数量。基本思路是这样子:1.......
  • AI 编程-工具篇
    by Claude3.5sonnet,Promptfrom李继刚TL;DR:主力工具组合:Cursor(新功能开发)+Zed(代码review/文档),AI代码占比90%关键启示:实践比理论更重要,需要具备表达、提问、抽象和想象能力才能更好地利用AI编程工具聊聊cursor,cline,continue,以及zed1.Cursor  -......
  • 【JAVA】Java基础—面向对象编程:常用API与数据结构—常用工具类(Collections、Arrays等
    在Java开发中,常用工具类如Collections和Arrays为我们提供了处理数据结构和算法的便捷方法。1.Collections框架背景介绍:Java的Collections框架提供了一套用于存储和操作数据的接口和类。它包括List、Set、Map等常用数据结构,帮助开发者高效地管理数据。重要性:在实际应用中,C......
  • 多线程编程入门Thread_Task_async_await简单秒懂
    `usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Threading;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;namespace多线程编......
  • 编程考古-计算机发展(中)
    晶体管计算机时代尽管真空管技术标志着计算机步入了现代化的门槛,但其固有的局限性——庞大的体积、高昂的能耗、频繁的故障以及不菲的成本——极大地阻碍了其普及与实际应用。晶体管的早期Point-contacttransistor点接触晶体管1947年,贝尔实验室的科学家约翰·巴丁(JohnB......
  • 【Python GUI 编程】tkinter :框架、标签框架
    在本文中,将介绍tkinterFrame框架小部件、LabelFrame标签框架小部件的使用方法。Frame框架Frame框架在窗体上建立一个矩形区域,作为一个容器,用于组织分组排列其他小部件。要创建框架,请使用以下构造函数。frame=tk.Frame(master,**options)tkinter中的每个小部件都......
  • 动态内存管理
                         ......