C - 基础 - 存储类、链接、内存管理

定义

存储类:即存储模型 自动、寄存器、具有外部链接的静态、具有内部链接的静态、空链接的静态,还有基于指针的类型。
作用域:作用范围
链接 : 是否可被外部引用
存储时期:变量在内存中保留的时间

作用域

代码块作用域:即方法体等类似范围
函数原型作用域:函数声明时范围
文件作用域:文件内函数外声明的范围,可被内部任何地方和其他文件引用,也称全局变量

链接

外部链接: 文件作用域,不用static修饰
内部链接: 文件作用域,使用static修饰
空链接: 代码块作用域 和 函数原型作用域 变量具有空链接

存储时期

静态存储时期: 静态变量在程序执行期间一直存在,具有文件作用域变量具有静态存储时期。
自动存储时期: 局部变量属于自动类型。

存储类

  • 寄存器变量 比自动变量访问快、无法获取地址
  • 代码块作用域的静态变量
  • 外部链接的静态变量 extern声明在其他文件中定义的变量
  • 具有内部链接的静态变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>

void count();
int main(int argc, char *argv[])
{
count();
count();
return 0;
}

void count()
{
// 代码块作用域的静态变量
static int count = 0;
count++;
printf("count = %d \n", count);
}

函数示例

掷骰子,随机数生成

头文件 dice.h

1
2
int roll(int max);
extern int count;

实现 dice.c

1
2
3
4
5
6
7
8
9
10
11
#include "dice.h"
#include <stdio.h>
#include <stdlib.h>

int count;

int roll(int max)
{
count++;
return rand() % max + 1;
}

调用 main.c

1
2
3
4
5
6
7
8
9
10
#include "dice.h"
#include <stdio.h>

int main(int argc, char *argv[])
{
printf("掷骰子 1 次 : %d \n", roll(100));
printf("掷骰子 2 次 : %d \n", roll(100));
printf("总次数 : %d \n", count);
return 0;
}

内存管理 malloc() 和 free()

创建动态数组,记得要free释放

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
double * money;
int max;
int number;
int i = 0;
puts("要整个多大的数组啊?\b");
scanf("%d", &max);

money = (double *)malloc(max * sizeof(double)); // 类型指派 c不是必要,c艹必要
if (NULL == money)
{
puts("空间不足");
exit(EXIT_FAILURE);
}

puts("往数组放数吧 \n");
while (i < max && scanf("%lf", &money[i]) == 1)
{
i++;
}

printf("你输入的是: %d \n", number = i);
for (i = 0; i < number; i++)
{
printf("%7.2f ", money[i]);
}
puts("over. \n");
free(money);
return 0;
}

推荐文章