(三)linux杂项

一、内存映像

    在运行程序时,系统会自动的映射一块虚拟的内存,应用程序就是在这样的虚拟内存空间中运行的,如下:


二、存储类型
C语言中,定义变量或者数组时,都会对该变量或者数组的属性进行说明,比如,int a;//int在这里说明变量a:1)在内存中的长度,2)数据在内存中的存储方式
如果我们还想知道变量a的其他属性,比如:在内存中的位置,占用内存的时间段,在程序中的使用范围,此时,这些属性就是由变量a的存储类型决定的,那么一个变量的存储类型是什么?
在C语言中存储类型分为以下6中:

存储类型 定义的位置定义的形式 在内存中的位置占用内存的时间段(生存期/存储期)  在程序中的使用范围(作用域)
1)自动存储类型 代码块内 int a; 定义--->代码块执行结束 代码块内
2)寄存器才存储类型 代码块内register int a; 寄存器/栈定义--->代码块执行结束 代码块内
3) 全局非static静态存储类型 代码块外int a; .data/.bss定义--->程序结束 多文件
4)全局static静态存储类型 代码块外static int a; .data/.bss定义--->程序结束 单文件
5)局部static静态存储类型 代码块内static int a; .data/.bss定义--->程序结束 代码块内
6)外部存储类型 代码块外 extern int a; .data/.bss定义--->程序结束 多文件


函数原型作用域:
指的是在函数原型声明语句中定义的变量,该变量具有函数原型作用域。例如:

#include <stdio.h>


void fun1(int ,int a[]);   //函数原型声明
void fun2(int ,int m, int a[][m]);   //函数的原型声明,该声明语句中的m,具有函数原型作用域
int main(void)
{
	//int a[5] = {1,2,3,4,5};
	int a[2][3] = {{1,2,3},{4,5,6}};
	fun2(2,3,a);
	return 0;
}

void fun1(int n,int a[n])
{
	int i;

	for(i = 0; i < n ; i++)
		printf("%d\t",a[i]);
	printf("\n");
}

void fun2(int n,int m, int a[n][m])
{
	int i,j;
	for(i = 0; i < n; i++){
		for(j = 0; j < m; j++)
			printf("%d\t",a[i][j]);
		printf("\n");
	}
}
三、内存管理
    1、堆与栈的特点
        1》栈特点:
1)执行效率高
2)空间相对比较小
3)有名空间
4)由系统分配和释放空间
5)生存期短,作用域小
2》堆特点:
1)执行效率较低
2)空间相对较大
3)无名空间
4)由软件工程师自己申请和释放空间
5)生存期有软件工程师自己决定,作用域一般是整个程序
    2、堆空间的使用
1》申请空间

      void *malloc(size_t size);
参数size:表示要申请的空间大小
返回值类型void* :申请成功时,malloc函数返回的空间的起始地址,该地址需要强制类型转换才可以使用,申请失败时,返回NULL
注意:
1)申请的空间是连续的
2)空间没有初始化
3)对空间为无名空间,所有要使用,必须通过指针访问。
例如1:

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


int main(void)
{
	int *p;


	p = (int*)malloc(sizeof(int));
	if(p == NULL){
		printf("malloc failed!\n");
		exit(1);   //退出当前程序
	}

	*p = 100;
	printf("*p = %d\n",*p);
	return 0;
}
例如2:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int a[5] = {1,2,3,4,5};
	int *p,i;

	//p = a;
	p = (int*)malloc(5*sizeof(int));
	if(p == NULL){
		printf("malloc failed!\n");
		exit(1);   //退出当前程序
	}
	for(i = 0; i < 5; i++)
		p[i] = i+1;
	for(i = 0; i < 5; i++)
		printf("%d\t",*(p+i));
	printf("\n");
	return 0;
}
void *calloc(size_t nmemb, size_t size);
参数:nmemb    表示数据个数
参数:size   表示数据大小
返回值与malloc一致,例如:

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

int main(void)
{
	int a[5] = {1,2,3,4,5};
	int *p,i;

	//p = a;
	p = (int*)calloc(5,sizeof(int));
	if(p == NULL){
		printf("malloc failed!\n");
		exit(1);   //退出当前程序
	}
	for(i = 0; i < 5; i++)
		p[i] = i+1;
	for(i = 0; i < 5; i++)
		printf("%d\t",*(p+i));
	printf("\n");
	return 0;
}
calloc申请的空间会初始化


void *realloc(void *ptr, size_t size);    //该函数功能:对申请的堆空间进行扩展
参数:ptr  表示之前申请的堆空间的起始地址
参数:size 表示扩展之后的空间的总大小
返回值:成功表示扩展之后的空间的起始地址,失败返回NULL


2》释放空间
void free(void *ptr);
参数:ptr  表示申请到的堆空间的起始地址
注意:
不要给free传NULL指针
不要释放申请的空间的一部分
例1:

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

int main(void)
{
	int *p,*t,i;

	//p = a;
	p = (int*)malloc(5*sizeof(int));
	if(p == NULL){
		printf("malloc failed!\n");
		exit(1);   //退出当前程序
	}
	t = p;
	for(i = 0; i < 5; i++)
		p[i] = i+1;
	for(i = 0; i < 5; i++)
		printf("%d\t",*p++);
	printf("\n");

	
	//free(NULL);    //没有意义
	//free(p);   //此时p存放的不是malloc返回的地址
	free(t);

	return 0;
}
例2:

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

int main(void)
{
	int *P;   
//	*P = 100;   //P为野指针
	int *p,*t,i;

	//p = a;
	p = (int*)malloc(5*sizeof(int));
	if(p == NULL){
		printf("malloc failed!\n");
		exit(1);   //退出当前程序
	}
	t = p;
	for(i = 0; i < 5; i++)
		p[i] = i+1;
	for(i = 0; i < 5; i++)
		printf("%d\t",*p++);
	printf("\n");

	//*p = 200;   //非法操作
	//free(NULL);    //没有意义
	//free(p);   //此时p存放的不是malloc返回的地址
	free(t);
	t == NULL;
//	*t = 200;	 //非法操作

	return 0;
}
四、static关键字
有三个作用:
1、修饰全局变量:
改变全局变量的作用域:多文件作用域变为单文件作用域
2、修饰局部变量:
改变局部变量的生存期:延长了变量的生存期,使得变量在程序结束时才释放空间
3、修饰函数:
改变函数的链接类型:外部链接变为内部链接
五、高级声明
1、声明和定义
1》声明
1)告诉系统变量或者函数此刻需要使用,它的定义在其他地方
2)在程序中可以对变量或者函数多次声明
2》定义
1)告诉系统给该变量分配适当大小的空间
2)在程序一个变量只能定义一次
3)定义语句可以当作特殊的声明
2、typedef关键字
给一个已有的类型引入一个新的名字

六、字节序
1、概念:字节序指的是处理器在对字取值时,解释其中各个字节的顺序。
2、小端序(big-endian):
最高有效位所在的字节放在最高字节位置上,其他字节依次放在低字节位置上,则该字节序称为高位优先(即小端序)。
3、大端序(little-endian):
最低有效位所在的字节放在最高字节位置上,其他字节依次放在低字节位置上,则该字节序称为低位优先(即大端序)。
4、判断机器的字节序

#include <stdio.h>

int main(void)
{
	unsigned int word = 0x12345678;
	unsigned char byte = *(char*)&word;
	printf("byte = %hhx\n",byte);
	if(byte == 0x12)
		printf("大端序!\n");
	else
		printf("小端序!\n");
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值