c语言指针和内存管理,C语言内存管理(数组,指针)

C语言内存管理(数组,指针)

几个规则:

【规则1】用malloc或new申请内存后,应该立即检查指针是否为null.防止使用指针为null的内存。

【规则2】不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为值使用。

【规则3】避免数组或指针的下标越界,特别要小心发生“多1”或者“少1”的操作。

【规则4】动态内存的申请和释放必须配对,防止内存泄露。

【规则5】用free或delete释放内存之后,要立即将指针设置为null,防止产生野指针。

数组与指针的区别:

数组要么在静态存储区创建(全局数组),要么在栈上创建,数组名对应一块内存,但不是指向,其地址和容量在生存周期内是不变的,只能改变其存放内容;

指针可以指向任意类型的内存,是“可变”的,更加灵活,也更危险;

例:

char a[]="hello";

a[0]='x';

以上两句没有问题!

char *p="hello";

p[0]='x';

以上两句编译无错,运行时会出错,因为它试图修改一个常量字符串!

内容复制与比较:

不能对数组名进行直接复制与比较。若想把数组a的内容复制给数组b,不能用语句b=a,否则将产生编译错误。应该是用标准函数库strcpy复制。同理,比较b和a的内容是否相同,不能用if(b==a)来判断,应该用标准函数strcmp进行比较。语句p=a并不能把a的内容复制指针p,而是把a的地址赋给了p.要想复制a的内容,可以先用库函数malloc为p申请一块容量为strlen(a)个的内容,再用strcpy进行字符串复制。同理,语句if(p==a)比较的不是内容而是地址,应该用库函数strcmp来比较。

char a[]=“hello”;

char b[10];

strcpy(b,a);//不能用b=a;

if(strcmp(b,a)==0)//不能用if(b==a)

//指针

int len=strlen(a);

char *p=(char*)malloc(sizeof(char*)*len);

strcpy(p,a);//不要用p=a;

if(strcmp(p,a)==0)//不要用if(p==a)

计算内存的容量:

用运算符sizeof可以计算出数组的容量(字节数)。如例题1,sizeof(a)的值是12。指针p指向a,但是 sizeof(p)的值却是4.这是因为sizeof(p)得到的是一个指针变量的字节数,相当于sizeof(char*),而不是p所指的内存容量。C语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。如例题2,不论数组a的容量是多少,sizeof(a)始终等sizeof(char *)。

//例题1

char a[] = “hello world”;

char *p = a; //sizeof(a)为12字节,sizeof(p)为4字节

//例题2

void Func(char a[100])

{

printf("%d",sizeof(a)); // 4字节而不是100字节

}

如果函数的参数是一个指针,不要指望用该指针去申请动态内存,应该改用“指向指针的指针”或者用函数返回值来传递动态内存,这里强调不要用return语句返回指向“栈内存”的指针,因为该内存在函数结束时自动消亡。

“野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。“野指针”的成因主要有两种:

(1)指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。例如    (2)指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。

(3)指针操作超越了变量的作用范围。

malloc与free是C /C语言的标准库函数,new/delete是C 的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free.因此C 语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete.注意new/delete不是库函数。C程序只能用malloc/free管理动态内存。

内存耗尽的办法:

(1)判断指针是否为NULL,如果是则马上用return语句终止本函数;

(2)判断指针是否为NULL,如果是则马上用exit(1)终止整个程序的运行;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中,指针是一种非常重要的数据类型,用于存储内存地址。通过指针,程序可以访问和操作内存中的数据。指针C语言中有着广泛的应用,包括动态内存分配、数组和函数调用等方面。 指针的使用使得程序员能够更直接地操作内存,但也带来了内存管理的责任。C语言中的内存管理是程序员需要关注的一个重要方面[1]。在C语言中,内存的分配和释放需要手动进行。如果不正确地管理内存,就容易出现内存泄漏、野指针等问题,导致程序崩溃或出现难以调试的错误。 动态内存分配是指在程序运行时根据需要分配内存空间。C语言提供了一些函数来实现动态内存分配,例如malloc、calloc和realloc函数。这些函数允许程序在运行时动态地请求所需的内存空间。 使用动态内存分配时,程序员需要负责在不再需要使用内存时手动释放已分配的内存空间,以免造成内存泄漏。释放内存的函数是free函数,通过调用free函数可以将先前分配的内存空间释放回系统。 除了动态内存分配外,C语言中还有一些其他的内存管理技术。例如,对于大型数据结构或数组,可以使用指针来减少内存的占用和提高程序的效率。此外,C语言中还有一些规则和约定来确保内存的正确使用,如避免野指针、空指针和越界访问等。 综上所述,C语言中的指针内存管理密切相关。指针使程序能够直接操作内存,但也需要程序员正确地管理内存的分配和释放。通过动态内存分配和其他内存管理技术,可以有效地利用和管理内存,提高程序的性能和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值