西邮Linux2021年面试题(上)

简介: 西邮Linux2021年面试题

请试着解释其输出。

int main(int argc, char *argv[])
{
    unsigned char a = 255;
    char ch = 128;
    a -= ch;
    printf("a = %d ch = %d\n", a, ch);
}

char的范围是-128~127,所以给一个char赋128时,实际上计算机会把它当作-127。


unsigned char的范围是0~256。

下面代码的运行输出结果是什么,并说说你的理解。

int main(int argc, char *argv[])
{
    char *str = "Xi You Linux Group 20";
    printf("%d\n", printf(str));
    return 0;
}

Xi You Linux Group 2021


printf的嵌套使用,会先输出内部的printf,然后printf的返回值为输出的字符的多少,即在外层的printf输出的内容。

这段代码的输出结果是什么?为什么会出现这样的结果?

int i = 2;
void func()
{
    if (i != 0)
    {
        static int m = 0;
        int n = 0;
        n++;
        m++;
        printf("m = %d, n = %d\n", m, n);
        i--;
        func();
    }
    else
    {
        return;
    }
}
int main(int argc, char *argv[])
{
    func();
    return 0;
}

m = 1, n = 1

m = 2, n = 1


使用static修饰符定义静态局部变量,它的生命周期是整个应用程序的运行时间,它只会被初始化一次。

下面程序会出现什么结果?为什么会出现这样的结果?

int main(int argc, char *argv[])
{
    char ch = 'A';
    int i = 65;
    unsigned int f = 33554433;
    *(int *)&f >>= 24;
    *(int *)&f = *(int *)&f + '?';
    printf("ch = %c i = %c f = %c\n", ch, i, *(int *)&f);
    return 0;
}

ch = A    i = A    f = A


65是'A'的ASCII码。


*(int *)&f相当于作强制类型转换,在左移24位之后对应的10进制数字再加上'?'对应的ASCII码,即为'A'的ASCII码。

下面代码的运行输出结果是什么,并说说你的理解。

int main(int argc, char *argv[])
{
    int a[2][2];
    printf("&a = %p\t&a[0] = %p\t&a[0][0] = %p\n", &a, &a[0],
           &a[0][0]);
    printf("&a+1 = %p\t&a[0]+1 = %p\t&a[0][0]+1= %p\n", &a + 1,
           &a[0] + 1, &a[0][0] + 1);
    return 0;
}

&a = 0x7fff765fd630     &a[0] = 0x7fff765fd630  &a[0][0] = 0x7fff765fd630

&a+1 = 0x7fff765fd640   &a[0]+1 = 0x7fff765fd638        &a[0][0]+1= 0x7fff765fd634


(本机,本次)


数组的地址是数组内第一个元素的地址,地址+1则相当于指向下一个元素。在&a[0]中的元素是一维数组。  

下列程序的功能是什么?有什么问题,你能找出问题并解决它吗?

int *get_array()
{
    int array[1121];
    for (int i = 0; i < sizeof(array) / sizeof(int); i++)
    {
        array[i] = i;
    }
    return array;
}
int main(int argc, char *argv[])
{
    int *p = get_array();
}

该程序返回的是一个本地数组,出了该函数,就出了该数组的生命周期,可能导致出错。用指针创建该数组即可。

下面代码的运行输出结果是什么,并说说你的理解。

int main(int argc, char *argv[])
{
    char str[] = "XiyouLinuxGroup";
    char *p = str;
    char x[] = "XiyouLinuxGroup\t\106F\bamily";
    printf("%zu %zu %zu %zu\n", sizeof(str), sizeof(p),
           sizeof(x), strlen(x));
    return 0;
}

16 8 25 24


sizeof计算的是所占内存的大小。而strlen计算的是字符串的长度(不包含结尾的'\0')。

如下程序,根据打印结果,你有什么思考?

int add(int *x, int y)
{
    return *x = (*x ^ y) + ((*x & y) << 1);
}
int a;
int main(int argc, char *argv[])
{
    int b = 2020;
    if (add(&b, 1) || add(&a, 1))
    {
        printf("XiyouLinuxGroup%d\n", b);
        printf("Waiting for y%du!\n", a);
    }
    if (add(&b, 1) && a++)
    {
        printf("XiyouLinuxGroup%d\n", b);
        printf("Waiting for y%du!\n", a);
    }
    return 0;
}

XiyouLinuxGroup2021

Waiting for y0u!


^或运算,&与运算,<<右移


||在第一个式子成立后,不再进行第二个式子的判断,

&&在第一个式子不成立后,不再进行第二个式子的判断。

在下段程序中,我们可以通过第一步打印出 a 的地址,假如在你的机器上面打印结果是 0x7ffd737c6db4;我们在第二步用 scanf 函数将这个地址值输入变量 c 中;第三步,随机输入一个数字,请问最终输出了什么结果,你知道其中的原理吗?

void func()
{
    int a = 2020;
    unsigned long c;
    printf("%p\n", &a);
    printf("我们想要修改的地址:");
    scanf("%lx", &c);
    printf("请随便输入一个数字:");
    scanf("%d", (int *)c);
    printf("a = %d\n", a);
}
int main(int argc, char *argv[])
{
    func();
}

运行开始输出的是a所在的地址,通过修改该地址的内容来达到修改a的值的作用。

相关文章
|
4月前
|
存储 运维 关系型数据库
2024年最全ceph的功能组件和架构概述(2),Linux运维工程面试问题
2024年最全ceph的功能组件和架构概述(2),Linux运维工程面试问题
2024年最全ceph的功能组件和架构概述(2),Linux运维工程面试问题
|
4月前
|
运维 Linux Docker
Docker笔记(个人向) 简述,最新高频Linux运维面试题目分享
Docker笔记(个人向) 简述,最新高频Linux运维面试题目分享
|
1月前
|
Linux 数据安全/隐私保护 Perl
解锁Linux高手秘籍:文件操作+命令解析大揭秘,面试场上让你光芒万丈,技术实力惊艳四座!
【8月更文挑战第5天】Linux作为服务器与嵌入式系统的基石,其文件管理和命令行操作是技术人员必备技能。本文从文件操作和基础命令两大方面,深入浅出地解析Linux核心要义,助你在面试中脱颖而出。首先探索文件系统的树状结构及操作,包括使用`ls -la`浏览文件详情、`touch`创建文件、`rm -r`慎删目录、`cp`与`mv`复制移动文件、以及利用`find`搜索文件。接着掌握命令行技巧,如用`cat`、`more`和`less`查看文件内容;借助`grep`、`sed`与`awk`处理文本;运用`ps`、`top`和`kill`管理进程;并通过`chmod`和`chown`管理文件权限。
62 8
|
1月前
|
监控 Linux 数据安全/隐私保护
Linux大神养成记:掌握这些逆天命令与快捷方式,面试秒变MVP,让你的技术实力燃爆全场!
【8月更文挑战第5天】Linux作为开源领域的核心,熟悉其基本命令对系统管理员和技术人员至关重要。本文精选了面试中常考的Linux命令,覆盖文件管理、文本处理、进程监控及权限调整等关键领域,并介绍了提高效率的快捷方式。通过掌握如`ls -l`、`grep &quot;error&quot;`、`top`、`chmod 755`等实用命令,以及Tab自动补全、历史命令浏览等功能,不仅能显著提升日常工作效能,还能在求职面试时展现出扎实的技术功底。
46 4
|
3月前
|
存储 网络协议 编译器
【干货总结】Linux C/C++面试知识点
Linux C/C++基础与进阶知识点,不仅用于面试,平时开发也用得上!
519 11
|
2月前
|
Linux 编译器 Shell
拼多多面试 Linux下一个应用程序开始执行到main被调用之间经历了什么?
在Linux中,程序启动到`main`调用涉及加载器、内核、动态链接器和C运行时。`execve`系统调用加载ELF文件,内核创建进程,加载段,设置栈和调用动态链接器。动态链接器解析符号,重定位,执行初始化。C运行时初始化堆栈,调用`main`。从`_start`到`main`的流程包括环境设置和函数调用。
61 0
|
4月前
|
运维 Linux 程序员
最全树莓派4B安装64位Linux(不用显示器键盘鼠标),Linux运维面试送分题
最全树莓派4B安装64位Linux(不用显示器键盘鼠标),Linux运维面试送分题
最全树莓派4B安装64位Linux(不用显示器键盘鼠标),Linux运维面试送分题
|
3月前
|
消息中间件 Unix Linux
[高频]Linux中常见的命令及常见面试题
[高频]Linux中常见的命令及常见面试题
|
2月前
|
存储 Java Linux
Java面试之Linux和docker
Java面试之Linux和docker
31 0
|
4月前
|
运维 Linux Docker
ChatGLM3在Docker环境部署(1),Linux运维电话面试技巧
ChatGLM3在Docker环境部署(1),Linux运维电话面试技巧