C语法中的内存分配

  关于c中的内存分配问题,这个问题怎么说好呢,我感觉还是和内存四区挂上了钩,在主调函数中栈区上分配的内存空间是可以在被调函数使用的:

  例:

  #include <stdio.h>

  #include <string.h>

  #include <stdlib.h>

  char *distribution(char *a)

  {

    char b[64];//被调函数中在栈区上分配一个64字节的一维数组

    printf("%s\n",a);//打印字符串为 aaabbb ,即被调函数可以使用主调函数分配的空间

    memcpy(b,a,strlen(a));//将a中的字符串copy到b中

    printf("%s\n",b)://打印字符串为  aaabbb

    return b;//将被调函数的头地址返回出去

  }

  int main()

  {

    char a[64] = {0};//在栈区上分配一个64字节的一维数组

    char *b = NULL;

    strcpy(a,"aaabbb");//将字符串复制到a中

    b = distribution(a);//a 即是一维数组的头地址,可以通过指针指向它的头地址

    //通过b接受函数返回的地址

    printf("%s\n",b);//打印的字符串为一堆乱码

    system("pause");

    return 0;

  }

  通过上面这个例子我们发现在栈区上:主调函数分配的空间可以在被调函数上使用,而被调函数上分配的空间无法在主调函数上使用,因为当其运行完之后会被析构掉,分配的空间也被析构掉了,但是地址是不会变的,但是这时这个地址上是没有分配内存空间的;所以打印出来的是一堆乱码;

  但是如果在堆区上就不一样了;

  char *distribution()

  {

    char *a = NULL;

    a = (char *)malloc(sizeof(char) * 64);

    strcpy(a,"aaabbb");//将字符串复制到a中

    return a;

  }

  int main()

  {

    int *a = NULL;

    a = distribution();

    printf("%s\n",a);//打印字符串为  aaabbb

    system("pause");

    return 0;

  }

  通过第二段程序我们可以发现,在堆上分配的空间即使在是在被调函数上分配的也可以在主调函数中使用,是不会被析构掉的;这块内存只能自己手工释放的;

  可以在被调函数和主函数上使用的空间,除了以上说的,还有全局变量,宏定义(注:宏定义不是分配空间,只是进行了宏替换,编译器会将宏放进一个转换表里,对其进行替换);今天就这么多吧!

时间: 2024-11-03 20:49:20

C语法中的内存分配的相关文章

iOS开发中的内存分配与分区

iOS开发中的内存分配与分区 关于RAM&ROM RAM与ROM就是具体的存储空间,统称为存储器. RAM(random access memory):运行内存,CPU可以直接访问,读写速度非常快,但是不能掉电存储.它又分为: 动态DRAM,速度慢一点,需要定期的刷新(充电),我们常说的内存条就是指它,价格会稍低一点,手机中的运行内存也是指它. 静态SRAM,速度快,我们常说的一级缓存,二级缓存就是指它,当然价格高一点. ROM(read only memory):存储性内存,可以掉电存储,例如

Java中的内存分配机制

Java的内存分为两种:一种是栈内存,一种是堆内存. 在函数中定义的一些基本类型变量和对象的引用都在函数的栈内存中分配.当在一个代码块中定义一个变量的时候,java就在栈中为其分配内存,当超过作用域的时候内存自动释放. 对内存用来存放new创建的对象和数组.在堆中分配的内存,由java虚拟机的垃圾回收机器管理.java的堆是运行时数据区,堆的优势是可以动态的分配内存大小,生存周期也不必事先告诉编译器,但是,由于是动态分配,存取速度慢. 栈的优势是比堆的存取速度快,仅次于寄存器,栈数据可以共享,但

c++中函数中变量内存分配以及返回指针、引用类型的思考

众所周知,我们在编程的时候经常会在函数中声明局部变量(包括普通类型的变量.指针.引用等等). 同时,为了满足程序功能的需要,函数的返回值也经常是指针类型或是引用类型,而这返回的指针或是引用也经常指向函数中我们自己声明的局部变量. 这样,程序在某些情况下就可能存在一定的问题.看似很简单的问题,通过仔细的分析,我们就能够更好的理解c++中内存分配和释放的问题. 好,废话不多说,我们进入正题.首先,简单介绍一下程序的内存区域的分配: 程序的内存分配 ①堆区(heap).这一部分主要是由程序开发人员自己

iOS程序中的内存分配 栈区堆区全局区(转)

在计算机系统中,运行的应用程序的数据都是保存在内存中的,不同类型的数据,保存的内存区域不同.一.内存分区 栈区(stack) 由编译器自动分配并释放,存放函数的参数值,局部变量等.栈是系统数据结构,对应线程/进程是唯一的.优点是快速高效,缺点时有限制,数据不灵活.[先进后出] 栈空间分静态分配 和动态分配两种. 静态分配是编译器完成的,比如自动变量(auto)的分配. 动态分配由alloca函数完成. 栈的动态分配无需释放(是自动的),也就没有释放函数. 为可移植的程序起见,栈的动态分配操作是不

Java中的内存分配与垃圾回收

一.内存分配 Java程序运行时的内存分配,按照JVM规范,包括以下几个区域:程序计数器.虚拟机栈.本地方法栈.方法区.堆.其中,前三个是线程私有的,与线程生命周期相同,线程退出内存自动回收:后两者是所有线程共享内存的,只在垃圾回收机制被触发时,被动回收. * 程序计数器,内存区域极小,是当前线程的字节码执行行号指示器: * 虚拟机栈.本地方法栈,即平时所说的“栈”,是虚拟机用来执行方法(包括Java.非Java方法)时,使用的临时内存空间,用来存储当前方法.局部变量等,全部基本类型变量,以及类

java中的内存分配原则

问题:Java中这些类.变量.字符串.方法,在内存中是怎样分配的? 首先,Java中的内存区域如下: ◆寄存器:我们在程序中无法控制 ◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中.当在一段代码块定义一个变量时,Java就在栈中 为这个变量分配内存空间,当该变量退出该作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用.实际上,栈中的变量指向堆内存中的变量,这就是Java中的指针! ◆堆:存放用new产生的数据.在堆中分配的内存,由J

Linux内核中常见内存分配函数

1.原理说明 Linux内核中采用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系统中,用到了四级页表,如图2-1所示.四级页表分别为: l   页全局目录(Page Global Directory) l   页上级目录(Page Upper Directory) l   页中间目录(Page Middle Directory) l   页表(Page Table) 页全局目录包含若干页上级目录的地址,页上级目录又依次包含若干页中间目录

c语言中的内存分配malloc、alloca、calloc、malloc、free、realloc、sbr

C语言跟内存分配方式 (1) 从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. (2) 在栈上创建.在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限. (3)从堆上分配,亦称动态内存分配.程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存.动态内存的

C++中的内存分配

C++提供下面两种方法分配和释放未构造的原始内存 (1)allocator 类,它提供可感知类型的内存分配 (2)标准库中的 operator new 和 operator delete,它们分配和释放需要大小的原始未类型化的内存 C++ 还提供不同的方法在原始内存中构造和撤销对象 (1)std::allocator<T>::construct 在未构造内存中初始化对象,std::allocator<T>::destroy 在对象上运行适当的析构函数. (2)定位 new 表达式(