[{"data":1,"prerenderedAt":447},["ShallowReactive",2],{"content:\u002F2022\u002Flinux-interview-2020":3,"surround:\u002F2022\u002Flinux-interview-2020":438},{"id":4,"title":5,"body":6,"categories":412,"date":414,"description":70,"draft":415,"extension":416,"image":417,"meta":418,"navigation":420,"path":421,"permalink":422,"published":422,"readingTime":423,"recommend":422,"references":422,"seo":428,"sitemap":429,"stem":430,"tags":431,"type":435,"updated":436,"__hash__":437},"content\u002Fposts\u002F2022\u002Flinux-interview-2020.md","西邮Linux兴趣小组2020纳新面试题题解",{"type":7,"value":8,"toc":392},"minimark",[9,44,58,63,73,76,82,86,94,96,102,106,114,116,122,126,134,136,142,146,154,156,162,166,174,176,182,186,194,196,202,206,214,216,222,244,252,254,260,264,279,283,291,293,299,303,311,314,325,331,335,347],[10,11,12,16],"blockquote",{},[13,14,15],"p",{},"注：",[17,18,19,23,34,37],"ol",{},[20,21,22],"li",{},"本题仅作为面试有限参考",[20,24,25,26,33],{},"为节省版面，省去所有 ",[27,28,31],"code",{"className":29,"code":31,"language":32},[30],"language-c","#include","c"," 指令",[20,35,36],{},"题目难度与序号无关",[20,38,39,40,43],{},"若无特殊声明，均假设在 ",[27,41,42],{"code":42},"Linux x86_64 GCC"," 编译器环境下",[13,45,46,47,52,53,57],{},"相比于2022年和2021年的小组面试题，此题难度较低，故只做代码层次的解读。相关知识点请移步 ",[48,49,51],"a",{"href":50},"\u002F2022\u002Flinux-interview-2022","西邮Linux兴趣小组2022纳新面试题题解"," 和 ",[48,54,56],{"href":55},"\u002F2022\u002Flinux-interview-2021","西邮Linux兴趣小组2021纳新面试题题解","。",[59,60,62],"h2",{"id":61},"_1-请试着解释其输出","1. 请试着解释其输出。",[10,64,65],{},[66,67,71],"pre",{"className":68,"code":69,"language":32,"meta":70},[30],"int main(int argc, char *argv[]) {\n    unsigned char a = 255;\n    char ch = 128;\n    a -= ch;\n    printf(\"a = %d ch = %d\\n\", a, ch);\n}\n","",[27,72,69],{"__ignoreMap":70},[13,74,75],{},"解读：",[66,77,80],{"className":78,"code":79,"language":32,"meta":70},[30],"#include \u003Cstdio.h>\nint main(int argc, char *argv[]) {\n    unsigned char a = 255;\n    char ch = 128;\n    \u002F\u002F char overflows to -128\n    a -= ch;\n    printf(\"a = %d ch = %d\\n\", a, ch);\n    \u002F\u002F a = 127, ch = -128\n}\n",[27,81,79],{"__ignoreMap":70},[59,83,85],{"id":84},"_2-下面代码的运行输出结果是什么并说说你的理解","2. 下面代码的运行输出结果是什么，并说说你的理解。",[10,87,88],{},[66,89,92],{"className":90,"code":91,"language":32,"meta":70},[30],"int main(int argc, char *argv[]) {\n    char *str = \"Xi You Linux Group 20\";\n    printf(\"%d\\n\", printf(str));\n    return 0;\n}\n",[27,93,91],{"__ignoreMap":70},[13,95,75],{},[66,97,100],{"className":98,"code":99,"language":32,"meta":70},[30],"#include \u003Cstdio.h>\nint main(int argc, char *argv[]) {\n    char *str = \"Xi You Linux Group 20\";\n    printf(\"%d\\n\", printf(str));\n    \u002F\u002F printf(str) returns the length of the string, 21\n    \u002F\u002F So the result is \"Xi You Linux Group 2021\"\n    return 0;\n}\n",[27,101,99],{"__ignoreMap":70},[59,103,105],{"id":104},"_3-这段代码的输出结果是什么为什么会出现这样的结果","3. 这段代码的输出结果是什么？为什么会出现这样的结果？",[10,107,108],{},[66,109,112],{"className":110,"code":111,"language":32,"meta":70},[30],"int i = 2;\nvoid func() {\n    if(i != 0) {\n    static int m = 0;\n    int n = 0;\n    n++;\n    m++;\n    printf(\"m = %d, n = %d\\n\", m, n);\n    i--;\n    func();\n    } else {\n    return;\n    }\n}\nint main(int argc, char *argv[]) {\n    func();\n    return 0;\n}\n",[27,113,111],{"__ignoreMap":70},[13,115,75],{},[66,117,120],{"className":118,"code":119,"language":32,"meta":70},[30],"#include \u003Cstdio.h>\nint i = 2;\nvoid func() {\n    if(i != 0) {\n    static int m = 0;\n    int n = 0;\n    n++;\n    m++;\n    \u002F\u002F m = 1, n = 1\n    printf(\"m = %d, n = %d\\n\", m, n);\n    i--;\n    func();\n    \u002F\u002F loop once, then m = 2, n = 1, i = 0 and exit loop\n    } else {\n    return;\n    }\n}\nint main(int argc, char *argv[]) {\n    func();\n    return 0;\n}\n",[27,121,119],{"__ignoreMap":70},[59,123,125],{"id":124},"_4-下面程序会出现什么结果为什么会出现这样的结果","4. 下面程序会出现什么结果？为什么会出现这样的结果？",[10,127,128],{},[66,129,132],{"className":130,"code":131,"language":32,"meta":70},[30],"int main(int argc, char * argv[]) {\n    char ch = 'A';\n    int i = 65;\n    unsigned int f = 33554433;\n    *(int *)&f >>= 24;\n    *(int *)&f = *(int *)&f + '?';\n    printf(\"ch = %c i = %c f = %c\\n\", ch, i, *(int *)&f);\n    return 0;\n}\n",[27,133,131],{"__ignoreMap":70},[13,135,75],{},[66,137,140],{"className":138,"code":139,"language":32,"meta":70},[30],"#include \u003Cstdio.h>\nint main(int argc, char * argv[]) {\n    char ch = 'A';\n    int i = 65;\n    unsigned int f = 33554433;\n    \u002F\u002F f = 0000 0010 0000 0000 0000 0000 0000 0001\n    *(int *)&f >>= 24;\n    \u002F\u002F f = 0000 0000 0000 0000 0000 0000 0000 0010\n    *(int *)&f = *(int *)&f + '?';\n    \u002F\u002F *(int *)&f = 2 + 63 = 65\n    \u002F\u002F ch = 'A', i = 'A', f = 'A'\n    printf(\"ch = %c i = %c f = %c\\n\", ch, i, *(int *)&f);\n    return 0;\n}\n",[27,141,139],{"__ignoreMap":70},[59,143,145],{"id":144},"_5-下面代码的运行输出结果是什么并说说你的理解","5. 下面代码的运行输出结果是什么，并说说你的理解。",[10,147,148],{},[66,149,152],{"className":150,"code":151,"language":32,"meta":70},[30],"int main(int argc, char *argv[]) {\n    int a[2][2];\n    printf(\"&a   = %p \\t &a[0]   = %p \\t &a[0][0]   = %p \\n\",\n           &a, &a[0], &a[0][0]);\n    printf(\"&a+1 = %p \\t &a[0]+1 = %p \\t &a[0][0]+1 = %p \\n\",\n           &a+1, &a[0] + 1, &a[0][0] + 1);\n    return 0;\n}\n",[27,153,151],{"__ignoreMap":70},[13,155,75],{},[66,157,160],{"className":158,"code":159,"language":32,"meta":70},[30],"#include \u003Cstdio.h>\nint main(int argc, char *argv[]) {\n    int a[2][2];\n    \u002F\u002F &a, &a[0] and &a[0][0] all refer to the address of a[0][0]\n    printf(\"&a   = %p \\t &a[0]   = %p \\t &a[0][0]   = %p \\n\",\n           &a, &a[0], &a[0][0]);\n    \u002F\u002F &a + 1 actually returns &a + sizeof(a)\n    \u002F\u002F &a[0] + 1 actually returns &a + sizeof(a[0])\n    \u002F\u002F &a[0][0] + 1 actually returns &a + sizeof(a[0][0])\n    printf(\"&a+1 = %p \\t &a[0]+1 = %p \\t &a[0][0]+1 = %p \\n\",\n           &a+1, &a[0] + 1, &a[0][0] + 1);\n    return 0;\n}\n",[27,161,159],{"__ignoreMap":70},[59,163,165],{"id":164},"_6-下列程序的功能是什么有什么问题你能找出问题并解决它吗","6. 下列程序的功能是什么？有什么问题，你能找出问题并解决它吗？",[10,167,168],{},[66,169,172],{"className":170,"code":171,"language":32,"meta":70},[30],"int* get_array() {\n    int array[1121];\n    for (int i = 0; i \u003C sizeof(array) \u002F sizeof(int); i++) {\n        array[i] = i;\n    }\n    return array;\n}\nint main(int argc, char *argv[]) {\n    int *p = get_array();\n}\n",[27,173,171],{"__ignoreMap":70},[13,175,75],{},[66,177,180],{"className":178,"code":179,"language":32,"meta":70},[30],"#include \u003Cstdio.h>\nint* get_array() {\n    int array[1121];\n    for (int i = 0; i \u003C sizeof(array) \u002F sizeof(int); i++) {\n        array[i] = i;\n    }\n    \u002F\u002F How dare you return this!?\n    return array;\n}\nint main(int argc, char *argv[]) {\n    \u002F\u002F get_array() returns the unusable address of a local variable,\n    \u002F\u002F the content of whom was discarded, but you can declare\n    \u002F\u002F a static variable in get_array() and return it to avoid so\n    int *p = get_array();\n}\n",[27,181,179],{"__ignoreMap":70},[59,183,185],{"id":184},"_7-下面代码的运行输出结果是什么并说说你的理解","7. 下面代码的运行输出结果是什么，并说说你的理解。",[10,187,188],{},[66,189,192],{"className":190,"code":191,"language":32,"meta":70},[30],"int main(int argc, char *argv[]) {\n    char str[] = \"XiyouLinuxGroup\";\n    char *p = str;\n    char x[] = \"XiyouLinuxGroup\\t\\106F\\bamily\";\n    printf(\"%zu %zu %zu %zu\\n\", sizeof(str), sizeof(p),\n                                sizeof(x), strlen(x));\n    return 0;\n}\n",[27,193,191],{"__ignoreMap":70},[13,195,75],{},[66,197,200],{"className":198,"code":199,"language":32,"meta":70},[30],"#include \u003Cstdio.h>\nint main(int argc, char *argv[]) {\n    char str[] = \"XiyouLinuxGroup\";\n    char *p = str;\n    char x[] = \"XiyouLinuxGroup\\t\\106F\\bamily\";\n    \u002F\u002F XiyouLinuxGroup Family\n    \u002F\u002F sizeof(str) = 16, containing '\\0' at the end\n    \u002F\u002F sizeof(p) = 8, 'cuz p is a char pointer,\n    \u002F\u002F only storing the address of variable str\n    \u002F\u002F sizeof(x) = 24, containing '\\0' at the end\n    \u002F\u002F strlen(x) = 24, 'cuz of '\\b', 'F' is covered by 'a'\n    printf(\"%zu %zu %zu %zu\\n\", sizeof(str), sizeof(p),\n                                sizeof(x), strlen(x));\n    return 0;\n}\n",[27,201,199],{"__ignoreMap":70},[59,203,205],{"id":204},"_8-如下程序根据打印结果你有什么思考","8. 如下程序，根据打印结果，你有什么思考？",[10,207,208],{},[66,209,212],{"className":210,"code":211,"language":32,"meta":70},[30],"int add(int *x, int y) {\n    return *x = (*x^y) + ((*x&y)\u003C\u003C1);\n}\nint a;\nint main(int argc, char *argv[]) {\n    int b = 2020;\n    if(add(&b, 1) || add(&a, 1)) {\n        printf(\"XiyouLinuxGroup%d\\n\", b);\n        printf(\"Waiting for y%du!\\n\", a);\n    }\n    if(add(&b, 1) && a++) {\n        printf(\"XiyouLinuxGroup%d\\n\", b);\n        printf(\"Waiting for y%du!\\n\", a);\n    }\n    return 0;\n}\n",[27,213,211],{"__ignoreMap":70},[13,215,75],{},[66,217,220],{"className":218,"code":219,"language":32,"meta":70},[30],"#include \u003Cstdio.h>\nint add(int *x, int y) {\n    return *x = (*x^y) + ((*x&y)\u003C\u003C1);\n}\nint a;\nint main(int argc, char *argv[]) {\n    int b = 2020;\n    \u002F\u002F add(&b, 1) returns true, so add(&a, 1) is not executed\n    if(add(&b, 1) || add(&a, 1)) {\n        printf(\"XiyouLinuxGroup%d\\n\", b);\n        printf(\"Waiting for y%du!\\n\", a);\n    }\n    \u002F\u002F add(&b, 1) returns true, while a++ executed with ruturning 0,\n    \u002F\u002F so this conditional statement will not be executed\n    if(add(&b, 1) && a++) {\n        printf(\"XiyouLinuxGroup%d\\n\", b);\n        printf(\"Waiting for y%du!\\n\", a);\n    }\n    return 0;\n}\n",[27,221,219],{"__ignoreMap":70},[59,223,225,226,229,230,234,235,239,240,243],{"id":224},"_9-在下段程序中我们可以通过第一步打印出-a-的地址假如在你的机器上面打印结果是0x7ffd737c6db4-我们在第二步用-scanf-函数将这个地址值输入变量-c-中第三步随机输入一个数字请问最终输出了什么结果你知道其中的原理吗","9. 在下段程序中，我们可以通过第一步打印出 ",[27,227,48],{"className":228,"code":48,"language":32},[30]," 的地址，假如在你的机器上面打印结果是",[27,231,233],{"className":232,"code":233,"language":32},[30],"0x7ffd737c6db4"," ；我们在第二步用 ",[27,236,238],{"className":237,"code":238,"language":32},[30],"scanf"," 函数将这个地址值输入变量 ",[27,241,32],{"className":242,"code":32,"language":32},[30]," 中；第三步，随机输入一个数字，请问最终输出了什么结果，你知道其中的原理吗？",[10,245,246],{},[66,247,250],{"className":248,"code":249,"language":32,"meta":70},[30],"void func() {\n    int a = 2020;\n    unsigned long c;\n    printf(\"%p\\n\", &a);\n    printf(\"我们想要修改的地址：\");\n    scanf(\"%lx\", &c);\n    printf(\"请随便输入一个数字：\");\n    scanf(\"%d\", (int *)c);\n    printf(\"a = %d\\n\", a);\n}\n",[27,251,249],{"__ignoreMap":70},[13,253,75],{},[66,255,258],{"className":256,"code":257,"language":32,"meta":70},[30],"\u002F\u002F It's totally about the basic concept of pointers\n#include \u003Cstdio.h>\nvoid func() {\n    int a = 2020;\n    unsigned long c;\n    \u002F\u002F We get the address of variable a\n    printf(\"%p\\n\", &a);\n    printf(\"我们想要修改的地址：\");\n    \u002F\u002F We want to modify the value on address entered\n    scanf(\"%lx\", &c);\n    printf(\"请随便输入一个数字：\");\n    \u002F\u002F And then we modified it. All done.\n    scanf(\"%d\", (int *)c);\n    printf(\"a = %d\\n\", a);\n}\n",[27,259,257],{"__ignoreMap":70},[59,261,263],{"id":262},"_10-请问一个c语言程序从源代码到可执行文件中间会进行哪些过程你能简单描述一下每个环节都做了什么事情吗","10. 请问一个C语言程序从源代码到可执行文件中间会进行哪些过程，你能简单描述一下每个环节都做了什么事情吗？",[265,266,267,270,273,276],"ul",{},[20,268,269],{},"编辑：创建和修改C程序的源代码",[20,271,272],{},"编译：将源代码转换为机器语言",[20,274,275],{},"链接：链接器将源代码由编译器产生的各种模块组合起来，再从C语言提供的程序库中添加必要的代码模块，将它们组成一个可执行的文件",[20,277,278],{},"执行：运行程序",[59,280,282],{"id":281},"_11-请解释一下这行代码做了什么","11. 请解释一下这行代码做了什么？",[10,284,285],{},[66,286,289],{"className":287,"code":288,"language":32,"meta":70},[30],"puts((char*)(int const[]){\n    0X6F796958,0X6E694C75,0X72477875,\n    0X3270756F,0X313230,0X00000A\n});\n",[27,290,288],{"__ignoreMap":70},[13,292,75],{},[66,294,297],{"className":295,"code":296,"language":32,"meta":70},[30],"#include \u003Cstdio.h>\nint main() {\n    \u002F\u002F It outputs a anonymous int array as a char array\n    \u002F\u002F using little-endian storing methods\n    puts((char *)(int const[]){\n        \u002F\u002F o y i X     n i L u     r G x u\n        0X6F796958, 0X6E694C75, 0X72477875,\n        \u002F\u002F 2 p u o (\\0)2 1 0\n        0X3270756F, 0X313230, 0X00000A});\n}\n",[27,298,296],{"__ignoreMap":70},[59,300,302],{"id":301},"_12-请随机输入一串字符串你能解释一下输出结果吗","12. 请随机输入一串字符串，你能解释一下输出结果吗？",[10,304,305],{},[66,306,309],{"className":307,"code":308,"language":32,"meta":70},[30],"int main(int argc, char *argv[]) {\n    char str[1121];\n    int key;\n    char t;\n    fgets(str, 1121, stdin);\n    for(int i = 0; i \u003C strlen(str) - 1; i++) {\n        key = i;\n        for(int j = i + 1; j \u003C strlen(str); j++) {\n            if(str[key] > str[j]) {\n                key = j;\n            }\n        }\n        t = str[key];\n        str[key] = str[i];\n        str[i] = t;\n    }\n    puts(str);\n    return 0;\n}\n",[27,310,308],{"__ignoreMap":70},[13,312,313],{},"这个程序使用选择排序对字符串进行了排序。",[59,315,317,318,321,322,324],{"id":316},"_13-用循环和递归求-fibonacci-数列你觉得这两种方式那种更好说说你的看法如果让你求-fibonacci-数列的第100项你觉得还可以用常规的方法求解吗请试着求出前100项的值tip大数运算","13. 用循环和递归求 ",[27,319,320],{"code":320},"Fibonacci"," 数列，你觉得这两种方式那种更好？说说你的看法。如果让你求 ",[27,323,320],{"code":320}," 数列的第100项，你觉得还可以用常规的方法求解吗？请试着求出前100项的值（tip大数运算）。",[66,326,329],{"className":327,"code":328,"language":32,"meta":70},[30],"#include \u003Cstdio.h>\nlong long fibo(int n) {\n    if (n == 1 || n == 2) return 1;\n    return fibo(n - 1) + fibo(n - 2);\n}\nint main() {\n    int n;\n    scanf(\"%d\", &n);\n    printf(\"%lld\\n\", fibo(n));\n}\n",[27,330,328],{"__ignoreMap":70},[59,332,334],{"id":333},"_14-linux-实操题","14. Linux 实操题",[10,336,337],{},[13,338,339,340,343,344,346],{},"请通过命令创建一个目录，在该目录中创建几个后缀为 ",[27,341,342],{"code":342},".Linux"," 的文件，然后通过命令查询这几个文件的基本属性信息（如文件大小，文件创建时间等），之后使用命令查看该目录下文件名含有“",[27,345,342],{"code":342},"”的文件的数量（不包括子目录下的文件），把得到的数字写入到一个文件中，最后删除此目录。",[265,348,349,356,362,368,374,380,386],{},[20,350,351,352],{},"创建目录\n",[353,354],"copy",{"code":355},"mkdir my_directory",[20,357,358,359],{},"进入目录\n",[353,360],{"code":361},"cd my_directory",[20,363,364,365],{},"创建后缀为.Linux的文件\n",[353,366],{"code":367},"touch file{1,2,3}.Linux",[20,369,370,371],{},"查询文件的基本属性信息\n",[353,372],{"code":373},"ls -l file*.Linux",[20,375,376,377],{},"查看包含\".Linux\"的文件数量\n",[353,378],{"code":379},"ls -l file*.Linux | wc -l > file_count.txt",[20,381,382,383],{},"查看文件数量\n",[353,384],{"code":385},"cat file_count.txt",[20,387,388,389],{},"删除目录及其内容\n",[353,390],{"code":391},"cd .. && rm -r my_directory",{"title":70,"searchDepth":393,"depth":393,"links":394},4,[395,397,398,399,400,401,402,403,404,406,407,408,409,411],{"id":61,"depth":396,"text":62},2,{"id":84,"depth":396,"text":85},{"id":104,"depth":396,"text":105},{"id":124,"depth":396,"text":125},{"id":144,"depth":396,"text":145},{"id":164,"depth":396,"text":165},{"id":184,"depth":396,"text":185},{"id":204,"depth":396,"text":205},{"id":224,"depth":396,"text":405},"9. 在下段程序中，我们可以通过第一步打印出 a 的地址，假如在你的机器上面打印结果是0x7ffd737c6db4 ；我们在第二步用 scanf 函数将这个地址值输入变量 c 中；第三步，随机输入一个数字，请问最终输出了什么结果，你知道其中的原理吗？",{"id":262,"depth":396,"text":263},{"id":281,"depth":396,"text":282},{"id":301,"depth":396,"text":302},{"id":316,"depth":396,"text":410},"13. 用循环和递归求 Fibonacci 数列，你觉得这两种方式那种更好？说说你的看法。如果让你求 Fibonacci 数列的第100项，你觉得还可以用常规的方法求解吗？请试着求出前100项的值（tip大数运算）。",{"id":333,"depth":396,"text":334},[413],"开发","2022-11-20 13:57:19",false,"md","https:\u002F\u002Fassets.zhilu.cyou\u002Fcover2\u002Flinux-interview-2020.jpg",{"slots":419},{},true,"\u002F2022\u002Flinux-interview-2020",null,{"text":424,"minutes":425,"time":426,"words":427},"10 min read",9.82,589200,1964,{"title":5,"description":70},{"loc":421},"posts\u002F2022\u002Flinux-interview-2020",[432,433,434],"Linux社团","面试题","C语言","tech","2023-11-10 21:08:28","eWvjlJ6cfvbiloREsnBPyiTnbtNLl0aVxMiQbUS-qQ8",[439,442],{"title":56,"path":55,"stem":440,"date":441,"type":435,"children":-1},"posts\u002F2022\u002Flinux-interview-2021","2022-11-20 12:52:52",{"title":443,"path":444,"stem":445,"date":446,"type":435,"children":-1},"C语言字符串时间获取下一秒的思考","\u002F2022\u002Fc-next-sec","posts\u002F2022\u002Fc-next-sec","2022-12-18 19:53:37",1782091377077]