首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Char*在函数中使用malloc创建,编译器表示地址在堆栈上,无法返回

Char*在函数中使用malloc创建,编译器表示地址在堆栈上,无法返回。

在C语言中,char是指向字符的指针类型,malloc函数用于在堆上动态分配内存空间。当我们在函数中使用malloc创建char时,编译器会将分配的内存空间地址存储在堆栈上的指针变量中。

堆栈是程序运行时用于管理函数调用和局部变量的一种数据结构。堆栈上的内存空间是有限的,并且在函数调用结束后会自动释放。因此,如果我们尝试将在堆上分配的内存地址直接返回给调用函数,那么在函数调用结束后,该内存空间将被释放,返回的地址将变得无效。

为了解决这个问题,我们可以使用指针参数或者全局变量来传递在堆上分配的内存地址。通过将指针参数传递给函数,我们可以在函数内部修改指针指向的内存内容,而不需要返回地址。另外,全局变量在函数调用结束后仍然保持有效,可以在其他函数中访问和使用。

总结起来,当我们在函数中使用malloc创建char*时,编译器表示地址在堆栈上,无法直接返回。我们可以通过指针参数或者全局变量来传递在堆上分配的内存地址,以便在函数调用结束后仍然可以访问和使用该内存空间。

相关搜索:使用malloc在for循环中创建链表总是返回相同的地址无法在使用malloc/ class new创建的类上调用虚拟函数如何使用地址在函数中创建新变量我无法使用我在.ts中创建的函数在C编程和使用malloc时,返回指针的指针函数中的free()在哪里?在erlang中,无法使用spawn( node,Fun)在远程节点上产生函数reduce()返回值无法在使用map函数的react的HTML中显示可以在列表上使用Filter()函数从更大的列表中创建新列表吗?问题:使用Flask时,从函数创建的全局变量无法在HTML模板中呈现使用VS2015 CLR在CDialog派生类上创建会返回0,在VC++ 6中运行良好错误:无法将对象转换为TreeNode类型(在函数中传递对象时出现堆栈错误) LeetCode上的树出现问题在C中,如何创建一个函数,该函数在给定字符串文字作为参数的情况下返回char*?(不在堆上分配新内存)如何使用apply after groupby()在lambda函数中的两个条件上创建数据帧?当webdriver在使用Angular 6开发的站点上运行时,selenium中的isEnabled()函数总是返回true我无法使创建的python函数返回一个值,然后我可以在另一个计算中使用该值我无法使用express在节点js中创建虚拟路径前缀(其中路径实际上并不存在于文件系统中如何使用另一个函数来创建一个函数,以在javascript中输出与字符一样多的行?例如:4行,共4个"#“。基本上,一个正方形
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

堆,栈,内存泄露,内存溢出介绍

简单的可以理解为: heap(堆):是由malloc之类函数分配的空间所在地。地址是由低向高增长的。 stack(栈):是自动分配变量,以及函数调用的时候所使用的一些空间。地址是由高向低减少的。...例如,声明函数中一个局部变量 int b; 系统自动为b开辟空间 heap: 需要程序员自己申请,并指明大小,cmalloc函数 如p1 = (char *)malloc(10); C++...但是速度,也最灵活 2.5堆和栈的存储内容 栈:函数调用时,第一个进栈的是主函数后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,大多数的C编译器,参数是由右往左入栈的...现在假设某个函数堆栈紧接在在内存缓冲区后面时,其中保存的函数返回地址就会与内存缓冲区相邻。此时,恶意攻击者就可以向内存缓冲区复制大量数据,从而使得内存缓冲区溢出并覆盖原先保存于堆栈函数返回地址。...这样,函数返回地址就被攻击者换成了他指定的数值;一旦函数调用完毕,就会继续执行“函数返回地址”处的代码。

3.8K40
  • 关于堆栈的讲解(我见过的最经典的)

    例如,声明函数中一个局部变量 int b; 系统自动为b开辟空间 heap: 需要程序员自己申请,并指明大小,cmalloc函数 如p1 = (char *)malloc(10); C++...中用new运算符 如p2 = (char *)malloc(10); 但是注意p1、p2本身是的。...2.5 堆和栈的存储内容 栈:函数调用时,第一个进栈的是主函数后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,大多数的C编译器,参数是由右往左入栈的,然后是函数的局部变量...首先,三个参数以从右到左的次序压入堆栈,先压“param3”,再压“param2”,最后压入“param1”;然后压入函数返回地址(RET),接着跳转到函数地址接着执行(这里要补充一点,介绍UNIX下的缓冲溢出原理的文章中都提到压入...由于“__stdcall”调用由被调函数调整堆栈,所以函数返回前要恢复堆栈,先回收本地变量占用的内存(ESP=ESP+3*4),然后取出返回地址,填入EIP寄存器,回收先前压入参数占用的内存(ESP=

    2.4K20

    C语言三剑客之《C专家编程》一书精华提炼

    bss段保存没有值的变量,事实只是,给出了运行时所需要的bss段大小。 运行时数据结构有好几种:堆栈,过程活动记录,数据,堆等。 堆栈有3个用处: 堆栈函数内部声明的局部变量提供存储空间。...发现数据段和文本段的位置,以及位于数据段的堆,方法是声明位于这些段的变量,并打印它们的地址。 过程活动记录:局部变量,参数,指向先前结构的指针,返回地址。...Fedora测了下,一个只有一个int参数的函数调用,要用32个字节,参数4个,返回地址4,esp和ebp其他不知道。fame.h是汇编,没太看懂。...最初,使散列函数返回0,这样所有元素都存储于第0个位置后面的链表。...new能真正的创建一个对象,malloc()函数只是分配内存。 C++的设计受限于严格的兼容性、内部一致性和高效率。 复用是软件科学的一个崇高而又朦胧的目标。

    2.4K50

    Android Native内存泄漏检测方案详解

    这是因为程序在编译时,无法预知在运行时会被装载到内存的哪个位置,所以编译后的程序,往往使用相对地址表示内存位置。..._Unwind_Backtrace函数创建并在每个栈帧上传递给回调函数。 _Unwind_GetIP返回无符号整数,表示当前函数返回地址。...因此,Android 5.0及更高版本,可直接使用这两个函数获取堆栈信息。 尽管这两个函数新版Android系统可用,但它们的行为可能受编译器优化、调试信息等影响。...然后,通过遍历FP链,获取每个栈帧的返回地址(存储LR寄存器)。最后,使用dladdr函数获取函数地址对应的符号信息,并打印堆栈信息。...然后,通过遍历FP链,获取每个栈帧的返回地址(存储LR寄存器)。最后,使用dladdr函数获取函数地址对应的符号信息,并打印堆栈信息。

    7410

    CC++ 学习笔记七(内存管理)

    栈分配:由编译器程序运行时从栈分配,函数栈退出时自动释放。栈分配的运算在处理器的指令集中,所以它的运行效率很高,但能分配的内容是有限的。...若分配成功,返回内存首地址,如果分配失败,返回NULL。 从功能上看,该函数malloc差不不大,不同的是calloc函数会将内存初始化为0。...当程序需要扩大空间时,函数试图从堆上当前内存段后的字节获取更多的内存空间,如有足够的存储空间,则扩大内存后返回地址。...对内存分配函数返回指针进行强制类型的转换 因内存分配函数返回值都为void (也称无类型),而且void 无法对该一段内存区域进行移位访问操作,所以使用分配函数必须对其转换成其他类型,以便进行操作。...内存分配函数后必须对数据进行初始化 使用malloc进行分配时,因该内存函数为进行初始化,若此时对内存进行访问,很可能会造成程序崩溃 char * chp = (char *)malloc(sizeof

    1.9K01

    Android Native内存泄漏检测方案详解

    这是因为程序在编译时,无法预知在运行时会被装载到内存的哪个位置,所以编译后的程序,往往使用相对地址表示内存位置。..._Unwind_Backtrace函数创建并在每个栈帧上传递给回调函数。 _Unwind_GetIP返回无符号整数,表示当前函数返回地址。...因此,Android 5.0及更高版本,可直接使用这两个函数获取堆栈信息。 尽管这两个函数新版Android系统可用,但它们的行为可能受编译器优化、调试信息等影响。...然后,通过遍历FP链,获取每个栈帧的返回地址(存储LR寄存器)。最后,使用dladdr函数获取函数地址对应的符号信息,并打印堆栈信息。...然后,通过遍历FP链,获取每个栈帧的返回地址(存储LR寄存器)。最后,使用dladdr函数获取函数地址对应的符号信息,并打印堆栈信息。

    55310

    缓冲区溢出

    而缓冲区溢出则是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,溢出的数据覆盖合法数据。...2 C/C++内存分配 任何一个源程序通常都包括静态的代码段(或者称为文本段)和静态的数据段,为了运行程序,操作系统首先负责为其创建进程,并在进程的虚拟地址空间中为其代码段和数据段建立映射。...程序在内存的映射 栈区(stack):由编译器自动分配与释放,存放为运行时函数分配的局部变量、函数参数、返回数据、返回地址等。其操作类似于数据结构的栈。...例子的内存映射 进程的栈是由多个栈帧构成的,其中每个栈帧都对应一个函数调用。当调用函数时,新的栈帧被压入栈;当函数返回时,相应的栈帧从栈中弹出。...由于需要将函数返回地址这样的重要数据保存在程序员可见的堆栈,因此也给系统安全带来了极大的隐患。 当程序写入超过缓冲区的边界时,就会产生所谓的“缓冲区溢出”。

    2K10

    扒掉“缓冲区溢出”的底裤

    而缓冲区溢出则是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,溢出的数据覆盖合法数据。...2 C/C++内存分配 任何一个源程序通常都包括静态的代码段(或者称为文本段)和静态的数据段,为了运行程序,操作系统首先负责为其创建进程,并在进程的虚拟地址空间中为其代码段和数据段建立映射。...程序在内存的映射 栈区(stack):由编译器自动分配与释放,存放为运行时函数分配的局部变量、函数参数、返回数据、返回地址等。其操作类似于数据结构的栈。...例子的内存映射 进程的栈是由多个栈帧构成的,其中每个栈帧都对应一个函数调用。当调用函数时,新的栈帧被压入栈;当函数返回时,相应的栈帧从栈中弹出。...由于需要将函数返回地址这样的重要数据保存在程序员可见的堆栈,因此也给系统安全带来了极大的隐患。 当程序写入超过缓冲区的边界时,就会产生所谓的“缓冲区溢出”。

    1.1K20

    【C++ 初阶路】--- C++内存管理

    【说明】 栈 又叫堆栈–非静态局部变量/函数参数/返回值等等,栈是向下增长的。 内存映射段 是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享内存,做进程间通信。...,无法找到malloc开辟的堆上空间!...可以先创建一个哨兵位(MyList head(-1);,栈开辟,此节点为了方便后续链表节点的链接,且创建单链表函数结束时自动销毁);然后通过cin输入链表节点值(val),并在堆上开辟链表节点(new...delete函数释放对象的空间 new T[N]的原理 调用operator new[]函数operator new[]实际调用operator new函数完成N个对象空间的申请 申请的空间执行...N次构造函数 delete[]的原理 释放的对象空间执行N次析构函数,完成N个对象中资源的清理 调用operator delete[]释放空间,实际operator delete[]调用operator

    7210

    C语言缓冲区溢出详解

    而缓冲区溢出则是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,溢出的数据覆盖合法数据。...2 C/C++内存分配 任何一个源程序通常都包括静态的代码段(或者称为文本段)和静态的数据段,为了运行程序,操作系统首先负责为其创建进程,并在进程的虚拟地址空间中为其代码段和数据段建立映射。...但是只有静态的代码段和数据段是不够的,进程在运行过程还要有其动态环境。 一般说来,默认的动态存储环境通过堆栈机制建立。所有局部变量及所有按值传递的函数参数都通过堆栈机制自动分配内存空间。如下图。...、返回地址等。...当调用函数时,新的栈帧被压入栈;当函数返回时,相应的栈帧从栈中弹出。由于需要将函数返回地址这样的重要数据保存在程序员可见的堆栈,因此也给系统安全带来了极大的隐患。

    2.5K2219

    char* 和char[]的差别

    比如,声明函数中一个局部变量int b;系统自己主动为b开辟空间 heap: 须要程序猿自己申请,并指明大小,cmalloc函数 如p1=(char*)malloc(10); C+...2.5堆和栈的存储内容 栈:函数调用时,第一个进栈的是主函数后的下一条指令(函数调用语句的下一条可运行语句)的 地址,然后是函数的各个參数,大多数的C编译器,參数是由右往左入栈的,然后是函数的局部变...另外,函数能够返回它的地址,也就是说,指针是局部变量,可是它指向的内容是全局的。 char a[] = “hello”; 这是定义了一个数组,分配在堆栈,初始化由编译器进行。...对于*pp = “abc”;这种情况,因为编译器优化,一般都会将abc存放在常量区域内,然后pp指针是局部变量,存放在栈,因此,函数返回中,同意返回地址(实际指向一个常量地址,字符串常量区);而...,char[] p是局部变量,当函数结束,存在栈的数组内容均被销毁,因此返回p地址是不同意的。

    1.2K30

    MIT 6.858 计算机系统安全讲义 2014 秋季(一)

    常见目标是使用堆栈的缓冲区的返回地址。在实践,任何内存错误都可能起作用。函数指针,C++ vtables,异常处理程序等。 需要一些有趣的代码进程的内存。...较早的一个系统:StackGuard 进入时堆栈放置一个金丝雀,返回前检查金丝雀值。 通常需要源代码;编译器插入金丝雀检查。 Q: 堆栈图中的金丝雀在哪里?...A: 金丝雀必须放在堆栈返回地址的“前面”,这样任何溢出重写返回地址也将重写金丝雀。...然而,电子围栏无法保护堆栈,并且内存开销太高,无法在生产系统中使用。 **边界检查方法#2:**胖指针 **想法:**修改指针表示以包含边界信息。...现在我们再次system(),并且%esp(4)。 等等。 基本,我们创建了一种新类型的机器,它由堆栈指针驱动,而不是常规指令指针!

    16910

    C Primer Plus 第12章 12.6 分配内存:malloc()和free()

    然而,它却可以返回那块内存第一个字节的地址。因此,您可以把那个地址赋给一个指针变量,并使用该指针来访问那块内存。因为char代表一个字节,所以传统曾将malloc()定义为指向char的指针类型。...malloc()可能无法获得所需数量的内存。在那种情形下,函数返回空指针,程序终止。...我们无法访问这些内存,因为地址不见了。由于没有调用free(),不可以再使用它了。 第二次调用gobble(),它又创建了一个temp,再次使用malloc()分配 16000个字节的内存。...char指针,ANSI 返回一个void指针。...本例,就是函数vlamal()终止的时候。因此不必使用free()。另一方面,使用malloc()创建的数组不必局限一个函数。例如,函数可以创建一个数组并返回指针,供调用该函数函数访问。

    43010

    深入理解Linux C语言内存管理

    每当一个函数被调用,该函数返回地址和一些关于调用的信息,比如某些寄存器的内容,被存储到栈区。然后这个被调用的函数再为它的自动变量和临时变量栈区分配空间,这就是C实现函数递归调用的方法。   ...栈(stack) :栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是说我们函数括弧"{}"定义的变量(但不包括static 声明的变量,static 意味着在数据段存放变量)。   ...06.png   左边的是UNIX/LINUX系统的执行文件,右边是对应进程逻辑地址空间的划分情况。   首先是堆栈区(stack),堆栈是由编译器自动分配释放,存放函数的参数值,局部变量的值等。...堆的申请是由程序员自己来操作的,C中使用malloc函数,而C++中使用new运算符,但是堆的申请过程比较复杂:当系统收到程序的申请时,会遍历记录空闲内存地址的链表,以求寻找第一个空间大于所申请空间的堆结点...以下是采用动态分配方式的例子:   1 p1 = (char *)malloc(10*sizeof(int));   此行代码分配了10个int类型的对象,然后返回对象在内存地址,接着这个地址被用来初始化指针对象

    2.8K10

    C内存管理一 概述

    有人 "嘘"我了,如果有能回答以下几个问题的同学请举手: 1.面试经常遇到:同学请说说堆栈的区别? 2.同学请说说一个函数堆栈调用过程(首先要知道函数过程是保存在什么的)。...而堆是采用手动管理(malloc 和 free程序创建、释放)、采用二叉树存储数据的存储区域。...需要程序员自己申请,并指明大小,cmalloc函数 如p1 = (char *)malloc(10); C++中用new运算符 如p2 = (char *)malloc(10); 但是注意p1、p2...例如:cmalloc函数  p1 = (char *)malloc(10);  p1 = (char *)malloc(20);  但是注意p1,p2本身是的。...}    函数调用过程 函数调用主要是栈中进行的:函数调用时,第一个进栈的是主函数后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,大多数的C编译器,参数是由右往左入栈的

    46510

    c++面试选择题_C语言经典笔试题

    对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象创建的同时要自动执行构造函数,对象消亡之前要自动执行析构函数。...从基类继承来的纯虚函数派生类仍是虚函数。 抽象类不仅包括纯虚函数,也可包括虚函数。抽象类必须用作派生其他类的基类,而不能用于直接创建对象实例。但仍可使用指向抽象类的指针支持运行时多态性。...2) 创建执行函数时,函数内局部变量的存储单元都可以创建函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。 3) 从堆上分配,亦称动态内存分配。...数组要么静态存储区被创建(如全局数组),要么创建。指针可以随时指向任意类型的内存块。...二、创建执行函数时,函数内局部变量的存储单元都可以创建函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

    1.1K10

    C++经典面试题(最全,面率最高)

    对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象创建的同时要自动执行构造函数,对象消亡之前要自动执行析构函数。...2) 创建执行函数时,函数内局部变量的存储单元都可以创建函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。 3) 从堆上分配,亦称动态内存分配。...数组要么静态存储区被创建(如全局数组),要么创建。指针可以随时指向任意类型的内存块。...二、创建执行函数时,函数内局部变量的存储单元都可以创建函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。...操作系统和编译器通过内存分配的位置来知道的,全局变量分配在全局数据段并且程序开始运行的时候被加载。局部变量则分配在堆栈里面 。 人一定要靠自己

    1.9K30

    分享丨CC++内存管理详解--堆、栈

    栈:执行函数时,函数内局部变量的存储单元都可以创建函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。...所以栈程序是应用最广泛的,就算是函数的调用也利用栈去完成,函数调用过程的参数,返回地址,EBP和局部变量都采用栈的方式存放。所以,我们推荐大家尽量用栈,而不是用堆。   ...针与数组的对比 C++/C程序,指针和数组不少地方可以相互替换着用,让人产生一种错觉,以为两者是等价的。 数组要么静态存储区被创建(如全局数组),要么创建。...对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象创建的同时要自动执行构造函数,对象消亡之前要自动执行析构函数。...这是因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。   如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。

    1K21

    面向开发的内存调试神器,如何使用ASAN检测内存泄漏、堆栈溢出等问题

    stack_array[101] = 1; return 0; } 上面的代码,我们创建了一个容量为100的数组,但在随后的写入操作超过数据容量的地址写入数据,导致了栈溢出...shadow 内存 ASANmalloc函数返回的内存地址通常至少是8个字节对齐,比如malloc(15)将分配得到2块大小为8字节的内存,在这个场景,第二块8字节内存的前5个字节是可以访问,但剩下的...某些情况下(例如, Linux 使用 -fPIE/-pie 编译器标志)可以使用零偏移来进一步简化检测。...其实原理也很简单: 对于全局变量,redzone 在编译时创建,redzone 的地址应用程序启动时传递给运行时库。 运行时库函数会将redzone 设置为不可使用并记录地址以供进一步错误报告。...最后,如果你觉得ASAN插桩代码和检测的对你某些的代码来说太慢了,那么可以使用编译器标志来禁用特定函数的,使ASAN跳过对代码某个函数的插桩和检测, 跳过分析函数编译器指令是: __attribute

    6K50
    领券