c语言内存分配,C语言内存分配代码说出不足

本文目录一览:

C语言中的动态内存分配的用法举例

1、malloc函数:其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。

2、free函数:由于内存区域总是有限的,不能不限制地分配下去,而且一个程序要尽量节省资源,所以当所分配的内存区域不用时,就要释放它,以便其它的变量或者程序使用。这时我们就要用到free函数。

3、calloc函数:其作用是在内存的动态存储区中分配n个长度为 size 的连续空间。函数返回一个指向分配区域的起始位置的指针;如果分配不成功,则返回NULL。

扩展资料:

函数运算符:

new

运算符new用于向系统申请动态存储空间,并把首地址作为运算结果,它的使用形式为:

指针变量=new 数据类型;

例如:

int *p=new int

该语句的作用是会用new从内存中申请了一个int型变量(4个字节),并将该变量的首地址赋给指针变量p。

new所建立的变量的初始值是任意的,也可在用new分配内存的同时进行初始化。使用形式为:

指针变量=new 数据类型(初始值)。

delete

堆内存可按照要求进行分配,程序对内存的需求量随时会发生变化,有时程序在运行种可能会不再需要由new分配的内存空间,而且程序还未运行结束,这时就需要把先前占用的内存空间释放给堆内存,以后重新分配,供程序的其他部分使用。运算符delete用于释放new分配的内存空间,删除建立的对象,它的使用形式为:

delete 指针变量;

其中的指针变量中保存着new分配的内存的首地址。

参考资料:百度百科–动态内存分配

C语言中内存分布及程序运行加载过程

一个程序内存分配:

下图是APUE中的一个典型C内存空间分布图(虚拟内存)

例如:

int g1=0, g2=0, g3=0;

int max(int i)

{

int m1=0,m2,m3=0, p_max;

static n1_max=0,n2_max,n3_max=0;

p_max = (int )malloc(10);

printf(“打印max程序地址\n”);

printf(“in max: 0xx\n\n”,max);

printf(“打印max传入参数地址\n”);

printf(“in max: 0xx\n\n”,i);

printf(“打印max函数中静态变量地址\n”);

printf(“0xx\n”,n1_max); //打印各本地变量的内存地址

printf(“0xx\n”,n2_max);

printf(“0xx\n\n”,n3_max);

printf(“打印max函数中局部变量地址\n”);

printf(“0xx\n”,m1); //打印各本地变量的内存地址

printf(“0xx\n”,m2);

printf(“0xx\n\n”,m3);

printf(“打印max函数中malloc分配地址\n”);

printf(“0xx\n\n”,p_max); //打印各本地变量的内存地址

if(i) return 1;

else return 0;

}

int main(int argc, char **argv)

{

static int s1=0, s2, s3=0;

int v1=0, v2, v3=0;

int p;

p = (int )malloc(10);

printf(“打印各全局变量(已初始化)的内存地址\n”);

printf(“0xx\n”,g1); //打印各全局变量的内存地址

printf(“0xx\n”,g2);

printf(“0xx\n\n”,g3);

printf(“======================\n”);

printf(“打印程序初始程序main地址\n”);

printf(“main: 0xx\n\n”, main);

printf(“打印主参地址\n”);

printf(“argv: 0xx\n\n”,argv);

printf(“打印各静态变量的内存地址\n”);

printf(“0xx\n”,s1); //打印各静态变量的内存地址

printf(“0xx\n”,s2);

printf(“0xx\n\n”,s3);

printf(“打印各局部变量的内存地址\n”);

printf(“0xx\n”,v1); //打印各本地变量的内存地址

printf(“0xx\n”,v2);

printf(“0xx\n\n”,v3);

printf(“打印malloc分配的堆地址\n”);

printf(“malloc: 0xx\n\n”,p);

printf(“======================\n”);

max(v1);

printf(“======================\n”);

printf(“打印子函数起始地址\n”);

printf(“max: 0xx\n\n”,max);

return 0;

}

打印结果:

ELF目标文件格式的最前端是 ELF****文件头(****ELF Header****) ,

包含了描述整个文件的基本属性,如ELF版本、目标机器型号、 程序入口地址 等

3 加载:

c语言内存有几种分配方式?

基本上C程序的元素存储在内存的时候有3种分配策略:

静态分配

如果一个变量声明为全局变量或者是函数的静态变量,这个变量的存储将使用静态分配方式。静态分配的内存一般会被编译器放在数据段或代码段来存储,具体取决于实现。这样做的前提是,在编译时就必须确定变量的大小。 以IA32的x86平台及gcc编译器为例,全局及静态变量放在数据段的低端;全局及静态常量放在代码段的高端

自动分配

函数的自动局部变量应该随着函数的返回会自动释放(失效),这个要求在一般的体系中都是利用栈(Stack)来满足的。相比于静态分配,这时候,就不必绝对要求这个变量在编译时就必须确定变量的大小,运行时才决定也不迟,但是C89仍然要求在编译时就要确定,而C99放松了这个限制。但无论是C89还是C99,都不允许一个已经分配的自动变量运行时改变大小。

所以说C函数永远不应该返回一个局部变量的地址。

要指出的是,自动分配也属于动态分配,甚至可以用alloca函数来像分配堆(Heap)一样进行分配,而且释放是自动的。

动态分配

还有一种更加特殊的情况,变量的大小在运行时有可能改变,或者虽然单个变量大小不变,变量的数目却有很大弹性,不能静态分配或者自动分配,这时候可以使用堆(Heap)来满足要求。ANSI C定义的堆操作函数是malloc、calloc、realloc和free。

使用堆(Heap)内存将带来额外的开销和风险。

c语言数组在内存中是怎么分配的?

C语言中内存为分三类:栈区、堆区、静态数据区。

局部变量在栈上分配,函数调用前的栈指针,要和函数返回后的栈指针一样,否则就会出错。

void test(void)

{

char i,a[10];

printf(“0x%x”, i);

printf(“0x%x”, a);

printf(“0x%x”, a+1);

printf(“0x%x”, a+2);

printf(“0x%x”, a+3);

}

扩展资料

c语言数组在内存分配

示例:

#includestdio.h

int main()

{

int a[4] = {11,12,13,14};

int b[4] = {21,22,23,24};

int *pa = a;

int i = 0;

while(i8)

{

i++;

printf(“now *p value = %d and”,*pa);

printf(“p addr value = %d \n”,pa);

pa++;

}

return 0;

}

C语言中分配内存

要实现根据程序的需要动态分配存储空间,就必须用到以下几个函数

1、malloc函数

malloc函数的原型为:

void

*malloc

(u

igned

int

size)

其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。还有一点必须注意的是,当函数未能成功分配存储空间(如内存不足)就会返回一个NULL指针。所以在调用该函数时应该检测返回值是否为NULL并执行相应的操作。

下例是一个动态分配的程序:

#include

#include

main()

{

int

count,*array;

/*count是一个计数器,array是一个整型指针,也可以理解为指向一个整型数组的首地址*/

if((array(int

*)

malloc(10*sizeof(int)))==NULL)

{

printf(“不能成功分配存储空间。”);

exit(1);

}

for

(count=0;count〈10;count++)

/*给数组赋值*/

array[count]=count;

for(count=0;count〈10;count++)

/*打印数组元素*/

printf(“%2d”,array[count]);

}

上例中动态分配了10个整型存储区域,然后进行赋值并打印。例中if((array(int

*)

malloc(10*sizeof(int)))==NULL)语句可以分为以下几步:

1)分配10个整型的连续存储空间,并返回一个指向其起始地址的整型指针

2)把此整型指针地址赋给array

3)检测返回值是否为NULL

2、free函数

由于内存区域总是有限的,不能不限制地分配下去,而且一个程序要尽量节省资源,所以当所分配的内存区域不用时,就要释放它,以便其它的变量或者程序使用。这时我们就要用到free函数。

其函数原型是:

void

free(void

*p)

作用是释放指针p所指向的内存区。

其参数p必须是先前调用malloc函数或calloc函数(另一个动态分配存储区域的函数)时返回的指针。给free函数传递其它的值很可能造成死机或其它灾难性的后果。

注意:这里重要的是指针的值,而不是用来申请动态内存的指针本身。例:

int

*p1,*p2;

p1=malloc(10*sizeof(int));

p2=p1;

……

free(p2)

/*或者free(p2)*/

malloc返回值赋给p1,又把p1的值赋给p2,所以此时p1,p2都可作为free函数的参数。

malloc函数是对存储区域进行分配的。

free函数是释放已经不用的内存区域的。

所以由这两个函数就可以实现对内存区域进行动态分配并进行简单的管理了。

原创文章,作者:KNGT,如若转载,请注明出处:https://www.506064.com/n/139524.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
KNGTKNGT
上一篇 2024-10-04 00:22
下一篇 2024-10-04 00:22

相关推荐

  • Python创建分配内存的方法

    在python中,我们常常需要创建并分配内存来存储数据。不同的类型和数据结构可能需要不同的方法来分配内存。本文将从多个方面介绍Python创建分配内存的方法,包括列表、元组、字典、…

    编程 2025-04-29
  • AES加密解密算法的C语言实现

    AES(Advanced Encryption Standard)是一种对称加密算法,可用于对数据进行加密和解密。在本篇文章中,我们将介绍C语言中如何实现AES算法,并对实现过程进…

    编程 2025-04-29
  • 学习Python对学习C语言有帮助吗?

    Python和C语言是两种非常受欢迎的编程语言,在程序开发中都扮演着非常重要的角色。那么,学习Python对学习C语言有帮助吗?答案是肯定的。在本文中,我们将从多个角度探讨Pyth…

    编程 2025-04-29
  • Python被称为胶水语言

    Python作为一种跨平台的解释性高级语言,最大的特点是被称为”胶水语言”。 一、简单易学 Python的语法简单易学,更加人性化,这使得它成为了初学者的入…

    编程 2025-04-29
  • OpenJudge答案1.6的C语言实现

    本文将从多个方面详细阐述OpenJudge答案1.6在C语言中的实现方法,帮助初学者更好地学习和理解。 一、需求概述 OpenJudge答案1.6的要求是,输入两个整数a和b,输出…

    编程 2025-04-29
  • Python按位运算符和C语言

    本文将从多个方面详细阐述Python按位运算符和C语言的相关内容,并给出相应的代码示例。 一、概述 Python是一种动态的、面向对象的编程语言,其按位运算符是用于按位操作的运算符…

    编程 2025-04-29
  • Python变量在内存中的存储

    该文章将从多个方面对Python变量在内存中的存储进行详细阐述,包括变量的声明和赋值、变量的引用和指向、内存地址的变化、内存管理机制等。 一、声明和赋值 在Python中,变量声明…

    编程 2025-04-29
  • Python语言由荷兰人为中心的全能编程开发工程师

    Python语言是一种高级语言,很多编程开发工程师都喜欢使用Python语言进行开发。Python语言的创始人是荷兰人Guido van Rossum,他在1989年圣诞节期间开始…

    编程 2025-04-28
  • Python语言设计基础第2版PDF

    Python语言设计基础第2版PDF是一本介绍Python编程语言的经典教材。本篇文章将从多个方面对该教材进行详细的阐述和介绍。 一、基础知识 本教材中介绍了Python编程语言的…

    编程 2025-04-28
  • Python语言实现人名最多数统计

    本文将从几个方面详细介绍Python语言实现人名最多数统计的方法和应用。 一、Python实现人名最多数统计的基础 1、首先,我们需要了解Python语言的一些基础知识,如列表、字…

    编程 2025-04-28

发表回复

登录后才能评论