C语言笔记(二)---变量范围、内存

it2026-08-18  10

#include <stdlib.h> #include <stdio.h> #include <time.h>

/* 类型 作用域 生命周期 全局变量 ; 整个项目中 程序创建到程序结束 static 局部变量; 一对{} 程序创建到程序结束 static 全局变量; 当前文件 程序创建到程序结束 static 函数 当前文件 auto 变量 一对{} 当前函数 extern 变量 整个程序 整个程序运行 extern 函数 整个程序 整个程序 register 变量 一对{} 当前函数 */

/* 内存分为四区: 代码区:程序指令 数据区(静态区、常量区、全局区):1未初始化的静态变量(全局、局部)默认初始值为0,2全局变量默认初始值为0,3字符串常量 栈区:变量、数组、结构体、指针、枚举、形参、常量(linux:1-16M,Windows:1-8M) 堆区:大的数据,各种文件等

注意: 栈区: ①只有c语言将数组放在栈区; ②如果在程序中创建的的数据应该放在堆区;栈区大小:在不同的操作系统中系统分配给每一个程序的战区空间大小不同,一般Windows是1-8M不等,一般LINUX是1-16M不等; ③死循环搞不死电脑 ,不会沾满内存但会沾满CUP; ④递归会导致程序崩溃,栈溢出; ⑤不是公用,可以被访问; 堆区: 开辟堆空间大小与内存有关;

内中位置模型: 注意:栈区向下生长,大小端对齐,先进后出

malloc在内存的动态存储区(堆区)中分配一块长度为size字节的连续区域,使用完之后必须释放,不然占用内存空间

*/

//声明:函数主体放在主函数之后,就必须先声明 extern void test31(); int main31() { for (int i = 0; i < 10; i++) { test31(); } system(“pause”); return 0; }

void test31() { //1.静态局部变量只会初始化一次,可以重复赋值 static int a = 10;//此行代码只会运行一次,重复调用函数时不会再执行 //int a = 10; printf("%d\n", a++); }

int a = 100; int main32() { int a = 10; printf("%d\n", a);//得到的是10,不是全局变量的值 system(“pause”); return 0; } int main33() { //申请动态内存 srand((unsigned int)time(NULL)); int* p = (int*)malloc(sizeof(int) * 10); memset(p, 0, 40);//作用:重置所有内存区域的值,参数:目标,值(只有0有效),字节大小 //memcpy(p, arr, 40);//作用:拷贝arr地址的内容到p指向的地址(地址不能重叠),可以拷贝一块地址 //memmove(p,arr,40);//作用:拷贝,可以重叠地址(创建临时变量来解决),效率更低 //int val = memcmp(arr1,arr2,4);//作用:比较前4个字节的大小(根据ASCII,int a =1,char b=1,结果不同,因为int是4个字节,char一个字节),val=0相等,val>1,val<1 for (int i = 0; i < 10; i++) { p[i] = i; //*p++ = i;改变指针指向,不能用 } printf("%d\n", p[2]); if§ //先判断,再释放 free§; system(“pause”); return 0; }

最新回复(0)