您的位置:首页 > 运维架构 > Linux

Linux下进程的内存结构

2015-07-24 23:15 726 查看
一、Linux下进程的内存结构

        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;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: