存储类别、链接和内存管理小结

本文介绍了C语言中的存储类别,包括作用域、链接(内部链接和外部链接)和存储期(静态存储期、线程存储期、自动存储期、动态分配存储期)。还详细讲解了extern关键字的使用,以及动态内存分配函数malloc()、calloc()和free()的用法。同时提到了restrict类型限定符,用于指针访问数据对象的唯一性。
摘要由CSDN通过智能技术生成

存储类别、链接和内存管理小结

  • 用到的关键字:extern、static、const、volatile、restricted、_Thread_local、_Atomic;
  • 函数:rand()、srand()、malloc()、calloc()、free();

存储类别

1.作用域

  • 作用域描述程序中可访问标识符的区域。

  • 块是一对花括号括起来的代码区域,块里面的变量具有块作用域,只内在块内访问。

  • 变量定义在函数的外面具有文件作用域file scope),从它定义处到定义所在文件的末尾均可见。

  • 2.链接

  1. 连接分为内部链接外部链接,外部链接变量可以在多文件程序中使用,具有文件作用域的变量可以是外部链接或内部链接;
  2. static关键字:表面变量的链接属性,在文件作用域变量类型前声明该关键字代表该变量具有内部链接,无则具有外部链接(在其他文件中可以访问)。
  3. 在块内没有声明static关键字,则表明该变量没有链接,退出块后便清除了;

3.存储期

  1. C对象有4种存储期:静态存储期、线程存储期、自动存储期、动态分配存储期
  2. 静态存储期:无论是什么链接属性,所有的文件作用域变量都具有静态存储期;
  3. 线程存储期:用于并发程序设计;
  4. 自动存储期:块作用域的变量通常具有自动存储期。当程序进入这个块时,为这些变量分配内存,退出块时释放刚才分配的内存(块作用域的变量也能具有静态存储期,只需要加上static关键字);
void more(int number)
{
    int index;
    static int ct = 0;
    ...
    return 0;
}

这里变量ct存储在静态存储期,它一直存在,但只有在作用域定义的more函数块中可以访问;

4.extern关键字

如果一个源代码文件使用外部变量定义在另一个源代码文件中,则必须使用extern在该文件中声明该变量;

extern char Coal; /*如果Coal被定义在另一个文件中*/

分配内存:malloc()和free()

这几个函数原型都在#include<stdlib.h>中;

**malloc()**函数可以在程序运行时分配更对的内存。该函数接受一个参数:所需的内存字节数。malloc()会找到合适的空闲块,这样的内存时匿名的,可以把地址赋给一个指针变量,并且使用指针访问这块内存。malloc()函数可用于返回指向数组的指针、指向结构的指针等。

double * ptd;
pte = (double *) malloc(30 * sizeof(double));

以上代码为30个double类型的值请求内存空间,并设置pt指向该位置;

**free()**函数的参数也应该是一个指针,指向malloc分配的一块内存,作用是释放内存;必须配套使用

注意:在使用malloc()时,程序在运行过程中才能确定数组大小。如果内存分配失败,可以调用exit()函数结束程序,标准提供两个返回值:EXIT_SUCCESS表示普通的程序结束,EXIT_FAILURE表示程序异常终止。

//malloc()可能分配不到内存,这种情况返回NULL指针;
if(pte == NULL)
{
	puts("Memory allocation failed. Goodbys.");
    exit(EXIT_FAILURE);
}

free()函数应位于程序的末尾;

calloc()函数

分配内存还可以使用calloc()函数,和malloc()类似。

long * newmen;
newmen = (long *)calloc(100,sizeof(long));

free()也可以用来释放calloc()分配的内存;

restrict类型限定符

restrict只能用于指针,表面该指针时访问数据对象的唯一且初始的方式;

int * restrict restar = (int *) malloc(10 * sizeof(int));
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值