Linux下进程的内存结构
2015-07-24 23:15
726 查看
一、Linux下进程的内存结构
Linux操作系统采用虚拟存储技术,使得每个进程都有独立的地址空间。该地址在32位系统下是大小为4GB的线性虚拟空间,用户看到和接触到的都是该虚拟地址,无法看到实际的物理内存地址。Linux系统下进程地址空间分别如图所示:
在.text区域,用户不具有读写权限。.rodata区域为只读区域,常常用于存储字符串常量,.data区域为可读可写,常常分配给全局变量及静态变量。在实际的应用中,程序员可以使用的空间只有.data、堆、栈三个区域,栈区主要分配给局部变量,当程序执行过程中需要才分配,在C语言中,执行到分配后的下一个}时即销毁该局部变量。
例:
当执行while结束后局部变量a即被销毁。
当程序元员需要临时开辟一片内存空间时,可以使用malloc函数向操作系统申请内存空间,这是申请的内存空间即为堆区。使用malloc函数后记得使用free销毁变量空间,以防内存泄漏。
在Linux下编程,只有充分理解虚拟进程地址的空间分布,才能很好的进行开发,如果访问了非法空间,就会造成段错误。
二、在Linux系统下编程中,如果使用math.h头文件,
4000
则编译时需要使用-lm选项,否则编译不过。
三、printf函数的新认识
printf函数输出字符串时,当输出字符达到一定量时才会进行输出,或者遇见换行或者程序运行结束后才会输出。
这个程序运行后不会输出hello world!
这样程序运行后可以输出很多hello world!
这样程序运行后会一次输出很多个hello world!而不是一次输入一个hello world!
这个程序即可正常输出hello world!
其实printf函数在输出的时候,会将输出的内容放进一个缓冲区中,当这个缓冲区满了才会输出到标准输出中,当遇见换行时即可强制输出,因此我们在使用printf时应该养成加上’\n’的习惯。
四、作业
1.编写一个函数实现输出整型一维数组。
2.编写一个函数实现输出整型二维数组。
Linux操作系统采用虚拟存储技术,使得每个进程都有独立的地址空间。该地址在32位系统下是大小为4GB的线性虚拟空间,用户看到和接触到的都是该虚拟地址,无法看到实际的物理内存地址。Linux系统下进程地址空间分别如图所示:
在.text区域,用户不具有读写权限。.rodata区域为只读区域,常常用于存储字符串常量,.data区域为可读可写,常常分配给全局变量及静态变量。在实际的应用中,程序员可以使用的空间只有.data、堆、栈三个区域,栈区主要分配给局部变量,当程序执行过程中需要才分配,在C语言中,执行到分配后的下一个}时即销毁该局部变量。
例:
while() { int a; }
当执行while结束后局部变量a即被销毁。
当程序元员需要临时开辟一片内存空间时,可以使用malloc函数向操作系统申请内存空间,这是申请的内存空间即为堆区。使用malloc函数后记得使用free销毁变量空间,以防内存泄漏。
在Linux下编程,只有充分理解虚拟进程地址的空间分布,才能很好的进行开发,如果访问了非法空间,就会造成段错误。
二、在Linux系统下编程中,如果使用math.h头文件,
4000
则编译时需要使用-lm选项,否则编译不过。
三、printf函数的新认识
printf函数输出字符串时,当输出字符达到一定量时才会进行输出,或者遇见换行或者程序运行结束后才会输出。
int main() { printf(“hello world!”); while(1); return 0; }
这个程序运行后不会输出hello world!
int main() { while(1) printf(“hello world!”); return 0; }
这样程序运行后可以输出很多hello world!
int main() { while(1) { printf(“hello world!”); sleep(1); } return 0; }
这样程序运行后会一次输出很多个hello world!而不是一次输入一个hello world!
int main() { printf(“hello world!\n”); while(1); return 0; }
这个程序即可正常输出hello world!
其实printf函数在输出的时候,会将输出的内容放进一个缓冲区中,当这个缓冲区满了才会输出到标准输出中,当遇见换行时即可强制输出,因此我们在使用printf时应该养成加上’\n’的习惯。
四、作业
1.编写一个函数实现输出整型一维数组。
<span style="font-size:18px;">#include<stdio.h> int printf_array_int(int len,const int *p) { int i; for(i = 0;i < len;i++) printf("%d ",*(p+i)); printf("\n"); return 0; } int main() { int a[10] = {1,2,3,4,5,6,7,8,9,10}; printf_array_int(10,a); return 0; } </span>
2.编写一个函数实现输出整型二维数组。
#include<stdio.h> void printf_array_int_2(int row,int col,const int *p) { int i,j; for(i = 0;i < row;i++) for(j = 0;j < col;j++) printf("%d ",*(p + col*i + j)); printf("\n"); } int main() { int a[3][3] = {1,2,3,4,5,6,7,8,9}; printf_array_int_2(3,3,a); return 0; }
相关文章推荐
- 基于Linux的智能家居的设计(3)
- Linux文件夹共享(NFS)
- Linux Rootkit之三:系统调用劫持简介
- 基于Linux的智能家居的设计(2)
- linux at91看门狗驱动设置
- centos6.6下安装GreenPlum4.3.5.2
- 基于Linux的智能家居的设计(1)
- linux配置java环境变量(详细)
- 3.1 linux进程 2015/7/22
- dd if=/dev/zero of=的含义是什么?Linux 下的dd命令使用详解
- linux 之makefile语法学习1
- Linux SSH 免密码登录
- Linux 多学习过程
- Linux内核学习方法
- Linux系统调用
- linux内核源码注解
- Linux - Ubuntu下JDK配置
- Linux Fedora 22 配置IP地址文件
- Linux Kernel系列 - 黄牛X内核代码凝视
- 七月二十二日 Linux操作系统c语言学习笔记