说明:所有题目均摘录于网络以及我所见过的面试题目,欢迎补充!

无特殊说明情况下,下面所有题s目都是linux下的32位C程序。

1、堆和栈有什么区别?

(1)栈由操作系统分配和释放;堆则是程序员手动去申请释放;

(2)栈是一块连续的内存区域,也就是栈顶地址和栈的最大容量是系统规定的;堆是不连续的内存区域,是因为系统使用链表来存储空闲内存地址。

(3)对于栈,在函数调用时,第一个入栈的是函数调用语句的下一条可执行语句的地址,然后是函数参数(一般是从右到左)入栈,最后是局部变量(静态变量不入栈)。函数调用结束后,局部变量先出栈,然后是参数。对于堆,一般在堆头部用一个字节存放堆大小,其他内容由程序员安排。

2、栈可能是向上生长,也可能是向下生长,试写一段代码,判断栈生长方向?

解析:我们可以根据局部变量入栈的特性来判断,由栈的连续性还有局部变量入栈的方式,我们可以来判断栈的生长方向。

bool  StackDownward()
{
int a = ;
int b = ; if(&a > &b)
{
return true;
}
else
{
return false;
}
}

 3、定义一个宏,来求结构体中某成员的偏移量

#define offsetof(TYPE, MEMBER)  ((size_t) &((TYPE *)0)->MEMBER )

解析:将0转换为(TYPE *)类型,也就是结构体首地址为0,因此数据成员的偏移量也就是相对于0的偏移量,直接取该成员地址就是所求的偏移量。

4、判断大小端

可用两种方法,如下:

BOOL IsBigEndian()
{
int a = 0x1234;
char b = *(char *)&a; //通过将int强制类型转换成char单字节,通过判断起始存储位置。即等于取b等于a的低地址部分
if( b == 0x12)
{
return TRUE;
}
return FALSE;
}

联合体union的存放顺序是所有成员都从低地址开始存放,利用该特性可以轻松地获得了CPU对内存采用Little-endian还是Big-endian模式读写:

BOOL IsBigEndian()
{
union NUM
{
int a;
char b;
}num;
num.a = 0x1234;
if( num.b == 0x12 )
{
return TRUE;
}
return FALSE;
}

关于大小端的概念:

1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
2) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

举一个例子,比如数字0x12 34 56 78在内存中的表示形式为:

1)大端模式:

低地址 -----------------> 高地址
0x12  |  0x34  |  0x56  |  0x78

2)小端模式:

低地址 ------------------> 高地址
0x78  |  0x56  |  0x34  |  0x12

可见,大端模式和字符串的存储模式类似。

参考:

1、《详解大端模式和小端模式》https://blog.csdn.net/ce123_zhouwei/article/details/6971544

linux系统编程面试题的更多相关文章

  1. Linux系统编程温故知新系列 --- 01

    1.大端法与小端法 大端法:按照从最高有效字节到最低有效字节的顺序存储,称为大端法 小端法:按照从最低有效字节到最高有效字节的顺序存储,称为小端法 网际协议使用大端字节序来传送TCP分节中的多字节整数 ...

  2. linux系统编程之错误处理

    在linux系统编程中,当系统调用出现错误时,有一个整型变量会被设置,这个整型变量就是errno,这个变量的定义在/usr/include/errno.h文件中 #ifndef _ERRNO_H /* ...

  3. LINUX系统编程 由REDIS的持久化机制联想到的子进程退出的相关问题

    19:22:01 2014-08-27 引言: 以前对wait waitpid 以及exit这几个函数只是大致上了解,但是看REDIS的AOF和RDB 2种持久化时 均要处理子进程运行完成退出和父进程 ...

  4. Linux系统编程-setitimer函数

    功能:linux系统编程中,setitimer是一个经常被使用的函数,可用来实现延时和定时的功能. 头文件:sys/time.h 函数原型: int setitimer(int which, cons ...

  5. Linux系统编程@进程通信(一)

    进程间通信概述 需要进程通信的原因: 数据传输 资源共享 通知事件 进程控制 Linux进程间通信(IPC)发展由来 Unix进程间通信 基于System V进程间通信(System V:UNIX系统 ...

  6. Linux 系统编程

    简介和主要概念 Linux 系统编程最突出的特点是要求系统程序员对它们工作的的系统的硬件和操作系统有深入和全面的了解,当然它们还有库和系统调用上的区别. 系统编程分为:驱动编程.用户空间编程和网络编程 ...

  7. Linux C 程序 文件操作(Linux系统编程)(14)

    文件操作(Linux系统编程) 创建一个目录时,系统会自动创建两个目录.和.. C语言实现权限控制函数 #include<stdio.h> #include<stdlib.h> ...

  8. 读书笔记之Linux系统编程与深入理解Linux内核

    前言 本人再看深入理解Linux内核的时候发现比较难懂,看了Linux系统编程一说后,觉得Linux系统编程还是简单易懂些,并且两本书都是讲Linux比较底层的东西,只不过侧重点不同,本文就以Linu ...

  9. Linux系统编程【转】

    转自:https://blog.csdn.net/majiakun1/article/details/8558308 一.Linux系统编程概论 1.1 系统编程基石 syscall: libc:标准 ...

随机推荐

  1. redis-查看日志

    转: redis-查看日志 redis在默认情况下,是不会生成日志文件的,所以需要配置 配置方法: 1.首先找到redis的配置文件 2.打开配置文件,找到logfile(可能有多个logfile,认 ...

  2. RabbitMQ整合Spring Booot【Exchange-Fanout模式】

    pom: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.o ...

  3. ResponseBody和文件上传

    SpringMVC默认使用MappingJacksonHttpMessageConverter对json数据进行转换 <dependency> <groupId>com.fas ...

  4. [转]MathJax与LaTex公式简介

    链接地址:https://www.cnblogs.com/linxd/p/4955530.html

  5. 论文阅读:FaceBoxes: A CPU Real-time Face Detector with High Accuracy

    文章: <FaceBoxes: A CPU Real-time Face Detector with High Accuracy> Introduction 2个挑战: 1)在杂乱背景下人 ...

  6. js 类型判断

  7. .net webapi跨域 web.config配置

    <system.webServer> <httpProtocol> <customHeaders> <add name="Access-Contro ...

  8. 在Jenkins的pipeline项目中运行jmeter测试-教程

    Jenkins 2.0的发布引入了一种新的项目类型 - Pipeline,以前只能通过插件获得.从Jenkins 2.0开始,Pipeline项目开箱即用. 与通常的“自由式”项目相比,管道构建具有几 ...

  9. Java连接数据库——最基础的方式

    JAVAWEB实现增删查改(图书信息管理)之Util类 Util.java  ↓ package BookSystem.Other; import java.sql.*; import java.ut ...

  10. 向php数组函数array_colum()传入奇怪的数组

    <?php // 向php数组函数array_colum()传入奇怪的数组 // array_colum()函数 返回行列数组的其中一列,可以用其他列的键充当键 $arr = [ [ 1, 2, ...