抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

本人编程萌新,见解仅供参考。

储存类别(详见链接

static
长期存在静态存储区,直到程序结束
静态局部变量是放在静态存储区内分配存储单元的,在整个程序运行期间都不释放,跟全局变量一样长期占用内存。

auto
随着函数的进栈和出栈而创建和销毁
我们编写程序的时候很少用auto定义变量,但其实我们之前定义的变量前面没有加static,编译系统会默认为是auto的存储方式,都会把变量存放在动态存储区。

extern
长期存在静态存储区,直到程序结束
extern来声明全局变量,以扩展全局变量的作用域。

register
离开函数值就会消失
当今的优化编译系统能够识别使用频繁的变量,从而自动将这些变量放在寄存器中,而不需要设定为register。因此,用register声明变量是不必要的。
例:

/* main.c */
#include <stdio.h>
int count;
extern void write_extern(); //跨文件调用support.c的write_extern函数
int main()
{
    count = 5;
    write_extern();
}
/* support.c */
#include <stdio.h>
extern int count;   //跨文件调用main.c的count变量
void write_extern(void)
{
    printf("count is %d\n", count);
}
/* main.c和support.c必须在同一个工程内 */

列表

存储类别 存储期 作用域 链接 声明方式
自动 自动 无链接 块内 无关键词
寄存器 自动 无链接 块内 关键字regsiter
静态外部链接 静态 文件 外部 所有函数外
静态内部链接 静态 文件 外部 所有函数外 关键字static
静态无链接 静态 块内 关键字static

链接

链接属性 解释
外部external 在工程必须要有一个变量的定义、可以使工程中的不同文件可以使用相同的变量
内部internal 仅在该文件中可以使用,其他文件中不能访问
无设置none

内存管理(详见链接

函数 描述
*calloc(int num, int size); 在内存中动态地分配 num 个长度为 size 的连续空间,并将每一个字节都初始化为 0。所以它的结果是分配了 num*size 个字节长度的内存空间,并且每个字节的值都是0。
free(void *address); 该函数释放 address 所指向的内存块,释放的是动态分配的内存空间。
*malloc(int num); 在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的。
*realloc(void *address, int newsize); 该函数重新分配内存,把内存扩展到 newsize。

上述函数多用于链表中,均处于<stdlib.h>中。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
   char name[100];
   char *description;
 
   strcpy(name, "Zara Ali");
 
   /* 动态分配内存 */
   description = (char *)malloc( 30 * sizeof(char) );
   if( description == NULL )
   {
      fprintf(stderr, "Error - unable to allocate required memory\n");
   }
   else
   {
      strcpy( description, "Zara ali a DPS student.");
   }
   /* 假设您想要存储更大的描述信息 */
   description = (char *) realloc( description, 100 * sizeof(char) );
   if( description == NULL )
   {
      fprintf(stderr, "Error - unable to allocate required memory\n");
   }
   else
   {
      strcat( description, "She is in class 10th");
   }
   
   printf("Name = %s\n", name );
   printf("Description: %s\n", description );
 
   /* 使用 free() 函数释放内存 */
   free(description);
}

限定符

const
const类型关键字声明的对象,其值不能通过赋值来递增,递减来修改。
volatile
只有volatile的成员函数才能被volatile的对象调用。
restrict
不能通过除该指针外所有其他直接或间接的方式修改该对象的内容。
_Atomic
该限定符是C11标准新增,当一个原子类型变量执行原子操作时,其它线程不能访问该变量。可用头文件stdatomic.h和Threads.h进行管理。

评论