[{"data":1,"prerenderedAt":787},["ShallowReactive",2],{"content:\u002F2022\u002Flinux-interview-2021":3,"surround:\u002F2022\u002Flinux-interview-2021":776},{"id":4,"title":5,"body":6,"categories":750,"date":752,"description":93,"draft":753,"extension":754,"image":755,"meta":756,"navigation":758,"path":759,"permalink":760,"published":760,"readingTime":761,"recommend":760,"references":760,"seo":766,"sitemap":767,"stem":768,"tags":769,"type":773,"updated":774,"__hash__":775},"content\u002Fposts\u002F2022\u002Flinux-interview-2021.md","西邮Linux兴趣小组2021纳新面试题题解",{"type":7,"value":8,"toc":728},"minimark",[9,66,71,96,125,143,147,189,192,198,202,223,226,232,236,259,271,273,279,283,294,301,321,325,333,339,343,351,357,361,412,418,422,438,444,448,481,517,523,527,555,583,594,600,604,615,622,626,634,640,644,658,662,667,671,676,684,711],[10,11,12,16,51],"blockquote",{},[13,14,15],"p",{},"注：",[17,18,19,28,38,41,44],"ul",{},[20,21,22,23,27],"li",{},"本题目仅作 ",[24,25,26],"code",{"code":26},"西邮Linux兴趣小组"," 2021 纳新面试题的有限参考。",[20,29,30,31,37],{},"为节省版面本试题的程序源码中省略了 ",[24,32,35],{"className":33,"code":35,"language":36},[34],"language-c","#include","c"," 指令。",[20,39,40],{},"本试题中的程序源码仅用于考察C语言基础，不应当作为C语言代码风格的范例。",[20,42,43],{},"题目难度与序号无关。",[20,45,46,47,50],{},"所有题目均假设编译并运行 ",[24,48,49],{"code":49},"x86_64 GNU\u002FLinux"," 环境。",[13,52,53,54,57,58,65],{},"Copyright © 2021 西邮Linux兴趣小组, All Rights Reserved.",[55,56],"br",{},"\n本试题使用采用 ",[59,60,64],"a",{"href":61,"rel":62},"http:\u002F\u002Fcreativecommons.org\u002Flicenses\u002Fby-nc-sa\u002F4.0\u002F",[63],"nofollow","知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议"," 进行许可。",[67,68,70],"h2",{"id":69},"_1-大小和长度竟然不是一个意思","1. 大小和长度竟然不是一个意思",[10,72,73,85,88],{},[13,74,75,79,80,84],{},[24,76,78],{"className":77,"code":78,"language":36},[34],"sizeof()"," 和 ",[24,81,83],{"className":82,"code":83,"language":36},[34],"strlen()"," 有什么异同之处？",[13,86,87],{},"他们对于不同参数的结果有什么不同？请试举例子说明。",[89,90,94],"pre",{"className":91,"code":92,"language":36,"meta":93},[34],"int main(void) {\n    char s[] = \"I love Linux\\0\\0\\0\";\n    int a = sizeof(s);\n    int b = strlen(s);\n    printf(\"%d %d\\n\", a, b);\n}\n","",[24,95,92],{"__ignoreMap":93},[13,97,98,101,102,106,107,111,112,101,116,106,120,124],{},[24,99,59],{"className":100,"code":59,"language":36},[34]," 为 ",[24,103,105],{"className":104,"code":105,"language":36},[34],"sizeof(s)","，即字符数组 ",[24,108,110],{"className":109,"code":110,"language":36},[34],"['I', ' ', 'l', 'o', 'v', 'e', ' ', 'L', 'i', 'n', 'u', 'x', '\\0', '\\0', '\\0']"," 的大小；",[24,113,115],{"className":114,"code":115,"language":36},[34],"b",[24,117,119],{"className":118,"code":119,"language":36},[34],"strlen(s)",[24,121,123],{"className":122,"code":123,"language":36},[34],"\"I love Linux\""," 的长度。",[13,126,127,128,132,133,137,138,142],{},"另外，如果声明 ",[24,129,131],{"className":130,"code":131,"language":36},[34],"char s[20] = \"I love Linux\\0\\0\\0\";","，则 ",[24,134,136],{"className":135,"code":136,"language":36},[34],"a = sizeof(s);"," 的值变为",[24,139,141],{"className":140,"code":141,"language":36},[34],"20","。",[67,144,146],{"id":145},"_2-箱子的大小和装入物品的顺序有关","2. 箱子的大小和装入物品的顺序有关",[10,148,149,183],{},[13,150,151,79,155,159,160,164,165,164,169,173,174,79,178,182],{},[24,152,154],{"className":153,"code":154,"language":36},[34],"test1",[24,156,158],{"className":157,"code":158,"language":36},[34],"test2"," 都含有：1个 ",[24,161,163],{"className":162,"code":163,"language":36},[34],"short","、1个 ",[24,166,168],{"className":167,"code":168,"language":36},[34],"int",[24,170,172],{"className":171,"code":172,"language":36},[34],"double","，那么 ",[24,175,177],{"className":176,"code":177,"language":36},[34],"sizeof(t1)",[24,179,181],{"className":180,"code":181,"language":36},[34],"sizeof(t2)"," 是否相等呢？这是为什么呢？",[89,184,187],{"className":185,"code":186,"language":36,"meta":93},[34],"struct test1 {\n    int a;\n    short b;\n    double c;\n};\nstruct test2 {\n    short b;\n    int a;\n    double c;\n};\nint main(void) {\n    struct test1 t1;\n    struct test2 t2;\n    printf(\"sizeof(t1): %d\\n\", sizeof(t1));\n    printf(\"sizeof(t2): %d\\n\", sizeof(t2));\n}\n",[24,188,186],{"__ignoreMap":93},[13,190,191],{},"解读：",[89,193,196],{"className":194,"code":195,"language":36,"meta":93},[34],"struct test1 {\n    int a;          \u002F\u002F 0 ~ 3\n    short b;        \u002F\u002F 4 ~ 5\n    double c;       \u002F\u002F 8 ~ 15\n} t1;               \u002F\u002F 0 ~ 15 -> 16\nstruct test2 {\n    short b;        \u002F\u002F 0 ~ 1\n    int a;          \u002F\u002F 4 ~ 7\n    double c;       \u002F\u002F 8 ~ 15\n} t2;               \u002F\u002F 0 ~ 15 -> 16\n",[24,197,195],{"__ignoreMap":93},[67,199,201],{"id":200},"_3-哦又是函数","3. 哦，又是函数",[10,203,204,217],{},[13,205,206,207,211,212,216],{},"想必在高数老师的教导下大家十分熟悉函数这个概念。那么你了解计算机程序设计中的函数吗？请编写一个 ",[24,208,210],{"className":209,"code":210,"language":36},[34],"func"," 函数，用来输出二维数组 ",[24,213,215],{"className":214,"code":215,"language":36},[34],"arr"," 中每个元素的值。",[89,218,221],{"className":219,"code":220,"language":36,"meta":93},[34],"\u002F*在这里补全func函数的定义*\u002F\nint main(void) {\n    int arr[10][13];\n    for (int i = 0; i \u003C 10; i++) {\n        for (int j = 0; j \u003C 13; j++) {\n            arr[i][j] = rand();\n        }\n    }\n    func(arr);\n}\n",[24,222,220],{"__ignoreMap":93},[13,224,225],{},"补全后：",[89,227,230],{"className":228,"code":229,"language":36,"meta":93},[34],"#include \u003Cstdio.h>\n#include \u003Cstdlib.h>\nvoid func(int a[10][13]) {\n    for (int i = 0; i \u003C 10; i++) {\n        for (int j = 0; j \u003C 13; j++)\n            printf(\"%d \", a[i][j]);\n        printf(\"\\n\");\n    }\n}\nint main(void) {\n    int arr[10][13];\n    for (int i = 0; i \u003C 10; i++) {\n        for (int j = 0; j \u003C 13; j++) {\n            arr[i][j] = rand();\n        }\n    }\n    func(arr);\n}\n",[24,231,229],{"__ignoreMap":93},[67,233,235],{"id":234},"_4就不能换个变量名吗","4.就不能换个变量名吗？",[10,237,238,253],{},[17,239,240,250],{},[20,241,242,243,79,246,249],{},"请结合下面的程序，简要谈谈 ",[24,244,245],{"code":245},"传值",[24,247,248],{"code":248},"传址"," 的区别。",[20,251,252],{},"简要谈谈你对C语言中变量的生命周期的认识。",[89,254,257],{"className":255,"code":256,"language":36,"meta":93},[34],"int ver = 123;\nvoid func1(int ver) {\n    ver++;\n    printf(\"ver = %d\\n\", ver);\n}\nvoid func2(int *pr) {\n    *pr = 1234;\n    printf(\"*pr = %d\\n\", *pr);\n    pr = 5678;\n    printf(\"ver = %d\\n\", ver);\n}\nint main() {\n    int a = 0;\n    int ver = 1025;\n    for (int a = 3; a \u003C 4; a++) {\n        static int a = 5;\n        printf(\"a = %d\\n\", a);\n        a = ver;\n        func1(ver);\n        int ver = 7;\n        printf(\"ver = %d\\n\", ver);\n        func2(&ver);\n    }\n    printf(\"a = %d\\tver = %d\\n\", a, ver);\n}\n",[24,258,256],{"__ignoreMap":93},[17,260,261,266],{},[20,262,263,265],{},[24,264,245],{"code":245}," 后，修改形参的值，实参的值不会改变。",[20,267,268,270],{},[24,269,248],{"code":248}," 后，修改形参的值，实参的值会改变。",[13,272,191],{},[89,274,277],{"className":275,"code":276,"language":36,"meta":93},[34],"#include \u003Cstdio.h>\nint ver = 123;\nvoid func1(int ver) {\\\n    \u002F\u002F ver@func1\n    ver++;\n    \u002F\u002F ver@func1 = 1026\n    printf(\"ver = %d\\n\", ver);\n    \u002F\u002F ver@func1 is discarded\n}\nvoid func2(int *pr) {\n    *pr = 1234;\n    \u002F\u002F *pr@func2(as ver@loop in main) = 1234\n    printf(\"*pr = %d\\n\", *pr);\n    pr = 5678;\n    printf(\"ver = %d\\n\", ver);\n    \u002F\u002F ver@global = 123\n    \u002F\u002F *pr@func2 is discarded, but ver@loop isn't\n}\nint main() {\n    int a = 0;\n    int ver = 1025;\n    for (int a = 3; a \u003C 4; a++) {\n        static int a = 5;\n        \u002F\u002F a@loop = 5\n        printf(\"a = %d\\n\", a);\n        a = ver;\n        \u002F\u002F a@loop = 1025\n        func1(ver);\n        int ver = 7;\n        \u002F\u002F ver@loop = 7\n        printf(\"ver = %d\\n\", ver);\n        func2(&ver);\n        \u002F\u002F jump out of loop, and a@loop and ver@loop are discarded\n    }\n    \u002F\u002F a@main = 0, ver@main = 1025\n    printf(\"a = %d\\tver = %d\\n\", a, ver);\n}\n",[24,278,276],{"__ignoreMap":93},[67,280,282],{"id":281},"_5-套娃真好玩","5. 套娃真好玩！",[10,284,285,288],{},[13,286,287],{},"请说明下面的程序是如何完成求和的？",[89,289,292],{"className":290,"code":291,"language":36,"meta":93},[34],"unsigned sum(unsigned n) { return n ? sum(n - 1) + n : 0; }\nint main(void) { printf(\"%u\\n\", sum(100)); }\n",[24,293,291],{"__ignoreMap":93},[13,295,296,297,300],{},"通过递归完成求和，每次递归返回的为其先前的数之和。相当于 ",[24,298,299],{"code":299},"栈(Stack)","，只有其前的函数的表达式返回值（出栈），新的栈顶函数表达式才能返回值。",[13,302,303,304,308,309,313,314,316,317,320],{},"特别地，当栈顶元素为 ",[24,305,307],{"className":306,"code":307,"language":36},[34],"sum(0)"," 时，会返回 ",[24,310,312],{"className":311,"code":312,"language":36},[34],"0"," 以实现从 ",[24,315,312],{"code":312}," 到 ",[24,318,319],{"code":319},"n"," 的求和。",[67,322,324],{"id":323},"_6-算不对的算术","6. 算不对的算术",[10,326,327],{},[89,328,331],{"className":329,"code":330,"language":36,"meta":93},[34],"void func(void) {\n    short a = -2;\n    unsigned int b = 1;\n    b += a;\n    int c = -1;\n    unsigned short d = c * 256;\n    c \u003C\u003C= 4;\n    int e = 2;\n    e = ~e | 6;\n    d = (d & 0xff) + 0x2022;\n    printf(\"a=0x%hx\\tb=0x%x\\td=0x%hx\\te=0x%x\\n\", a, b, d, e);\n    printf(\"c=Ox%hhx\\t\\n\", (signed char)c);\n}\n",[24,332,330],{"__ignoreMap":93},[89,334,337],{"className":335,"code":336,"language":36,"meta":93},[34],"#include \u003Cstdio.h>\nvoid func(void) {\n    short a = -2;\n    \u002F\u002F a = 1111 1111 1111 1110\n    unsigned int b = 1;\n    b += a;\n    \u002F\u002F b = 1111 1111 1111 1111 1111 1111 1111 1111\n    int c = -1;\n    \u002F\u002F c = 1111 1111 1111 1111 1111 1111 1111 1111\n    unsigned short d = c * 256;\n    \u002F\u002F d = 1111 1111 0000 0000\n    c \u003C\u003C= 4;\n    \u002F\u002F c = 1111 1111 1111 1111 1111 1111 1111 0000\n    int e = 2;\n    \u002F\u002F e = 0000 0000 0000 0000 0000 0000 0000 0010\n    e = ~e | 6;\n    \u002F\u002F e = 1111 1111 1111 1111 1111 1111 1111 1101 |\n    \u002F\u002F     0000 0000 0000 0000 0000 0000 0000 0110\n    \u002F\u002F   = 1111 1111 1111 1111 1111 1111 1111 1111\n    d = (d & 0xff) + 0x2022;\n    \u002F\u002F d = 1111 1111 0000 0000 & 0000 0000 1111 1111 + 0x2022 = 0x2022\n    printf(\"a=0x%hx\\tb=0x%x\\td=0x%hx\\te=0x%x\\n\", a, b, d, e);\n    \u002F\u002F a = 0xfffe, b = 0xffffffff, d = 0x2022, e = 0xffffffff\n    printf(\"c=Ox%hhx\\t\\n\", (signed char)c);\n    \u002F\u002F (signed char)c = 1111 0000 = 0xf0\n}\n",[24,338,336],{"__ignoreMap":93},[67,340,342],{"id":341},"_7-指针和数组的恩怨情仇","7. 指针和数组的恩怨情仇",[10,344,345],{},[89,346,349],{"className":347,"code":348,"language":36,"meta":93},[34],"int main(void) {\n    int a[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};\n    int(*b)[3] = a;\n    ++b;\n    b[1][1] = 10;\n    int *ptr = (int *)(&a + 1);\n    printf(\"%d %d %d \\n\", a[2][1], **(a + 1), *(ptr - 1));\n\n}\n",[24,350,348],{"__ignoreMap":93},[89,352,355],{"className":353,"code":354,"language":36,"meta":93},[34],"int main(void) {\n    int a[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};\n    int(*b)[3] = a;\n    ++b;\n    b[1][1] = 10;\n    int *ptr = (int *)(&a + 1);\n    \u002F\u002F *ptr = *(&a + sizeof(a)) = b\n    \u002F\u002F **(a + 1) = **(*(&a[0] + sizeof(a[0]))) = a[1][0]\n    \u002F\u002F *(ptr - 1) = *(&a + sizeof(a) - sizeof(*ptr)) = a[3][3]\n    printf(\"%d %d %d \\n\", a[2][1], **(a + 1), *(ptr - 1));\n\n}\n",[24,356,354],{"__ignoreMap":93},[67,358,360],{"id":359},"_8-移形换位之术","8. 移形换位之术",[10,362,363,377,406],{},[13,364,365,366,369,370,369,373,376],{},"下面有 ",[24,367,59],{"className":368,"code":59,"language":36},[34],"、",[24,371,115],{"className":372,"code":115,"language":36},[34],[24,374,36],{"className":375,"code":36,"language":36},[34]," 三个变量和4个相似的函数。",[17,378,379,382,385,396],{},[20,380,381],{},"你能说出使用这三个变量的值或地址作为参数分别调用这5个函数，在语法上是否正确吗？",[20,383,384],{},"请找出下面的代码中的错误。",[20,386,387,79,391,395],{},[24,388,390],{"className":389,"code":390,"language":36},[34],"const int",[24,392,394],{"className":393,"code":394,"language":36},[34],"int const"," 是否有区别？如果有区别，请谈谈他们的区别。",[20,397,398,79,402,395],{},[24,399,401],{"className":400,"code":401,"language":36},[34],"const int *",[24,403,405],{"className":404,"code":405,"language":36},[34],"int const *",[89,407,410],{"className":408,"code":409,"language":36,"meta":93},[34],"int a = 1;\nint const b = 2;\nconst int c = 3;\nvoid funco(int n) {\n    n += 1;\n    n = a;\n}\nvoid func1(int *n) {\n    *n += 1;\n    n = &a;\n}\nvoid func2(const int *n) {\n    *n += 1;\n    n = &a;\n}\nvoid func3(int *const n) {\n    *n += 1;\n    n = &a;\n}\nvoid func4(const int *const n) {\n    *n += 1;\n    n = &a;\n}\n",[24,411,409],{"__ignoreMap":93},[89,413,416],{"className":414,"code":415,"language":36,"meta":93},[34],"int a = 1;\nint const b = 2;\nconst int c = 3;\nvoid func0(int n) {\n    \u002F\u002F a formal parameter n\n    n += 1;\n    n = a;\n}\nvoid func1(int *n) {\n    \u002F\u002F a pointer  n\n    *n += 1;\n    n = &a;\n}\nvoid func2(const int *n) {\n    \u002F\u002F a const int pointer to n\n    \u002F\u002F *n is a const, unchangeable\n    *n += 1;\n    n = &a;\n}\nvoid func3(int *const n) {\n    \u002F\u002F an int pointer to const n\n    *n += 1;\n    \u002F\u002F n is a const, unchangeable\n    n = &a;\n}\nvoid func4(const int *const n) {\n    \u002F\u002F a const int pointer to const n\n    \u002F\u002F *n is a const, unchangeable\n    *n += 1;\n    \u002F\u002F n is a const, unchangeable\n    n = &a;\n}\n",[24,417,415],{"__ignoreMap":93},[67,419,421],{"id":420},"_9-听说翻转字母大小写不影响英文的阅读","9. 听说翻转字母大小写不影响英文的阅读？",[10,423,424,432],{},[13,425,426,427,431],{},"请编写 ",[24,428,430],{"className":429,"code":430,"language":36},[34],"convert"," 函数用来将作为参数的字符串中的大写字母转换为小写字母，将小写字母转换为大写字母。返回转换完成得到的新字符串。",[89,433,436],{"className":434,"code":435,"language":36,"meta":93},[34],"char *convert(const char *s);\nint main(void) {\n    char *str = \"XiyouLinux Group 2022\";\n    char *temp = convert(str);\n    puts(temp);\n}\n",[24,437,435],{"__ignoreMap":93},[89,439,442],{"className":440,"code":441,"language":36,"meta":93},[34],"#include \u003Cstdio.h>\n#include \u003Cstring.h>\nchar *convert(const char *s) {\n    int len = strlen(s);\n    char *result = malloc(sizeof(char) * (len + 1));\n    strcpy(result, s);\n    for (int i = 0; i \u003C len; i++) {\n        if (result[i] >= 'A' && result[i] \u003C= 'Z')\n            result[i] += 32;\n        else if (result[i] >= 'a' && result[i] \u003C= 'z')\n            result[i] -= 32;\n    }\n    return result;\n}\nint main(void) {\n    char *str = \"XiyouLinux Group 2022\";\n    char *temp = convert(str);\n    puts(temp);\n}\n",[24,443,441],{"__ignoreMap":93},[67,445,447],{"id":446},"_10-交换礼物的方式","10. 交换礼物的方式",[10,449,450,475],{},[17,451,452,460,468],{},[20,453,454,455,459],{},"请判断下面的三种 ",[24,456,458],{"className":457,"code":458,"language":36},[34],"Swap"," 的正误，分别分析他们的优缺点。",[20,461,462,463,467],{},"你知道这里的 ",[24,464,466],{"className":465,"code":466,"language":36},[34],"do {...} while(0)"," 的作用吗？",[20,469,470,471,474],{},"你还有其他的方式实现 ",[24,472,458],{"className":473,"code":458,"language":36},[34]," 功能吗？",[89,476,479],{"className":477,"code":478,"language":36,"meta":93},[34],"#define Swap1(a, b, t)   \\\n    do {                 \\\n        t = a;           \\\n        a = b;           \\\n        b = t;           \\\n    } while (0)\n#define Swap2(a, b)      \\\n    do {                 \\\n        int t = a;       \\\n        a = b;           \\\n        b = t;           \\\n    } while (0)\nvoid Swap3(int a, int b) {\n    int t = a;\n    a = b;\n    b = t;\n}\n",[24,480,478],{"__ignoreMap":93},[17,482,483,503,510],{},[20,484,485,79,489,493,494,497,498,502],{},[24,486,488],{"className":487,"code":488,"language":36},[34],"Swap1()",[24,490,492],{"className":491,"code":492,"language":36},[34],"Swap2()"," 通过宏定义实现两数交换，",[24,495,466],{"className":496,"code":466,"language":36},[34]," 可以用代码块花括号 ",[24,499,501],{"className":500,"code":501,"language":36},[34],"{...}"," 替代，目的是防止宏替换后语句不在同一代码块内。",[20,504,505,509],{},[24,506,508],{"className":507,"code":508,"language":36},[34],"Swap3()"," 错误，交换形参的值并不能改变实参。",[20,511,512,516],{},[24,513,515],{"className":514,"code":515,"language":36},[34],"Swap4()"," 利用指针来实现。",[89,518,521],{"className":519,"code":520,"language":36,"meta":93},[34],"void Swap4(int *a, int *b) {\n    int temp = *a;\n    *a = *b;\n    *b = temp;\n}\n",[24,522,520],{"__ignoreMap":93},[67,524,526],{"id":525},"_11-据说有个东西叫参数","11. 据说有个东西叫参数",[10,528,529,549],{},[13,530,531,532,79,536,540,541,544,545,548],{},"你知道 ",[24,533,535],{"className":534,"code":535,"language":36},[34],"argc",[24,537,539],{"className":538,"code":539,"language":36},[34],"argv"," 的含义吗？请解释下面的程序。你能在不使用 ",[24,542,535],{"className":543,"code":535,"language":36},[34]," 的前提下，完成对 ",[24,546,539],{"className":547,"code":539,"language":36},[34]," 的遍历吗？",[89,550,553],{"className":551,"code":552,"language":36,"meta":93},[34],"int main(int argc, char *argv[]) {\n    printf(\"argc = %d\\n\", argc);\n    for (int i = 0; i \u003C argc; i++)\n        printf(\"%s\\n\", argv[i]);\n}\n",[24,554,552],{"__ignoreMap":93},[13,556,557,560,561,564,565,568,569,573,574,577,578,582],{},[24,558,535],{"className":559,"code":535,"language":36},[34]," 指 argument count，即参数计数器，",[24,562,539],{"className":563,"code":539,"language":36},[34]," 指 argument vector，即参数数组。程序在运行时传入的第一个参数就是程序的启动路径\u002F文件名，因此 ",[24,566,535],{"className":567,"code":535,"language":36},[34]," 最小为 ",[24,570,572],{"className":571,"code":572,"language":36},[34],"1","。在循环中，整型 ",[24,575,535],{"className":576,"code":535,"language":36},[34]," 会自增到溢出，然后打印 ",[24,579,581],{"className":580,"code":581,"language":36},[34],"argv[0]"," 即程序路径。",[13,584,585,586,589,590,593],{},"不使用 ",[24,587,535],{"className":588,"code":535,"language":36},[34]," 遍历 ",[24,591,539],{"className":592,"code":539,"language":36},[34]," 的方法：",[89,595,598],{"className":596,"code":597,"language":36,"meta":93},[34],"#include \u003Cstdio.h>\nint main() {\n    _CRTIMP extern int __argc;\n    _CRTIMP extern char **__argv;\n    printf(\"argc = %d\\n\", __argc);\n    for (int i = 0; i \u003C __argc; i++)\n        printf(\"%s\\n\", __argv[i]);\n}\n",[24,599,597],{"__ignoreMap":93},[67,601,603],{"id":602},"_12-人去楼空","12. 人去楼空",[10,605,606,609],{},[13,607,608],{},"这段代码有是否存在错误？谈一谈静态变量与其他变量的异同。",[89,610,613],{"className":611,"code":612,"language":36,"meta":93},[34],"int *func1(void) {\n    static int n = 0;\n    n = 1;\n    return &n;\n}\nint *func2(void) {\n    int *p = (int *)malloc(sizeof(int));\n    *p = 3;\n    return p;\n}\nint *func3(void) {\n    int n = 4;\n    return &n;\n}\nint main(void) {\n    *func1() = 4;\n    *func2() = 5;\n    *func3() = 6;\n}\n",[24,614,612],{"__ignoreMap":93},[13,616,617,621],{},[24,618,620],{"className":619,"code":620,"language":36},[34],"*func3()"," 返回的是局部变量，在外部赋值时此局部变量已被抛弃，成为了野指针。",[67,623,625],{"id":624},"_13-奇怪的输出","13. 奇怪的输出",[10,627,628],{},[89,629,632],{"className":630,"code":631,"language":36,"meta":93},[34],"int main(void) {\n    int data[] = {0x636c6557, 0x20656d6f, 0x78206f74,\n                  0x756f7969, 0x6e694c20, 0x67207875,\n                  0x70756f72, 0x32303220, 0x00000a31};\n    puts((const char*)data);\n}\n",[24,633,631],{"__ignoreMap":93},[89,635,638],{"className":636,"code":637,"language":36,"meta":93},[34],"#include \u003Cstdio.h>\nint main(void) {\n    \u002F\u002F               c l e W       e m o     x   o t\n    int data[] = {0x636c6557, 0x20656d6f, 0x78206f74,\n                  \u002F\u002F u o y i     n i L       g   x u\n                  0x756f7969, 0x6e694c20, 0x67207875,\n                  \u002F\u002F p u o r     2 0 2          \\0 1\n                  0x70756f72, 0x32303220, 0x00000a31};\n    \u002F\u002F unsigned char data[34] = {\n    \u002F\u002F     0x57, 0x65, 0x6C, 0x63, 0x6F, 0x6D, 0x65, 0x20, 0x74, 0x6F, 0x20, 0x78,\n    \u002F\u002F     0x69, 0x79, 0x6F, 0x75, 0x20, 0x4C, 0x69, 0x6E, 0x75, 0x78, 0x20, 0x67,\n    \u002F\u002F     0x72, 0x6F, 0x75, 0x70, 0x20, 0x32, 0x30, 0x32, 0x31, 0x00};\n    \u002F\u002F }\n    puts((const char *)data);\n}\n",[24,639,637],{"__ignoreMap":93},[67,641,643],{"id":642},"_14-请谈谈对从c语言文件到可执行文件的过程的理解","14. 请谈谈对从「C语言文件到可执行文件」的过程的理解",[17,645,646,649,652,655],{},[20,647,648],{},"编辑：创建和修改C程序的源代码",[20,650,651],{},"编译：将源代码转换为机器语言",[20,653,654],{},"链接：链接器将源代码由编译器产生的各种模块组合起来，再从C语言提供的程序库中添加必要的代码模块，将它们组成一个可执行的文件",[20,656,657],{},"执行：运行程序",[67,659,661],{"id":660},"_15-选做-堆和栈","15. (选做) 堆和栈",[10,663,664],{},[13,665,666],{},"你了解程序中的栈和堆吗？它们在使用上有什么区别呢？请简要说明。",[67,668,670],{"id":669},"_16-选做-多文件","16. (选做) 多文件",[10,672,673],{},[13,674,675],{},"一个程序在不使用任何头文件的情况下，如何使用另一个文件中的函数。",[67,677,679,680,683],{"id":678},"_17-选做-gnulinux-与文件","17. (选做) ",[24,681,682],{"code":682},"GNU\u002FLinux"," 与文件",[10,685,686],{},[17,687,688,694,706],{},[20,689,690,691,693],{},"你知道如何在 ",[24,692,682],{"code":682}," 下如何使用命令行创建文件与文件夹吗？",[20,695,531,696,698,699,705],{},[24,697,682],{"code":682}," 下的命令 ",[24,700,703],{"className":701,"code":703,"language":704},[702],"language-sh","ls","sh"," 的每一列的含义吗？",[20,707,531,708,710],{},[24,709,682],{"code":682}," 下文件的访问时间、修改时间、创建时间如何查看吗？并简单说说他们的区别。",[10,712,713,716,725],{},[13,714,715],{},"恭喜你做完了整套面试题，快来参加西邮 Linux 兴趣小组的面试吧！",[13,717,718,719,721,722,724],{},"西邮 Linux 兴趣小组面试时间：",[55,720],{},"\n2021年10月25日至2021年10月31日晚8点。",[55,723],{},"\n听说面试来的早一点更能获得学长学姐的好感哦。",[13,726,727],{},"我们在 FZ103 等你！",{"title":93,"searchDepth":729,"depth":729,"links":730},4,[731,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748],{"id":69,"depth":732,"text":70},2,{"id":145,"depth":732,"text":146},{"id":200,"depth":732,"text":201},{"id":234,"depth":732,"text":235},{"id":281,"depth":732,"text":282},{"id":323,"depth":732,"text":324},{"id":341,"depth":732,"text":342},{"id":359,"depth":732,"text":360},{"id":420,"depth":732,"text":421},{"id":446,"depth":732,"text":447},{"id":525,"depth":732,"text":526},{"id":602,"depth":732,"text":603},{"id":624,"depth":732,"text":625},{"id":642,"depth":732,"text":643},{"id":660,"depth":732,"text":661},{"id":669,"depth":732,"text":670},{"id":678,"depth":732,"text":749},"17. (选做) GNU\u002FLinux 与文件",[751],"开发","2022-11-20 12:52:52",false,"md","https:\u002F\u002Fassets.zhilu.cyou\u002Fcover2\u002Flinux-interview-2021.jpg",{"slots":757},{},true,"\u002F2022\u002Flinux-interview-2021",null,{"text":762,"minutes":763,"time":764,"words":765},"14 min read",13.765,825900,2753,{"title":5,"description":93},{"loc":759},"posts\u002F2022\u002Flinux-interview-2021",[770,771,772],"Linux社团","面试题","C语言","tech","2023-07-30 11:45:33","Um7mIqTph9_208wIJhJnCnOPNDWtPmKlwEg-ae0UHuI",[777,782],{"title":778,"path":779,"stem":780,"date":781,"type":773,"children":-1},"西邮Linux兴趣小组2022纳新面试题题解","\u002F2022\u002Flinux-interview-2022","posts\u002F2022\u002Flinux-interview-2022","2022-11-19 22:32:46",{"title":783,"path":784,"stem":785,"date":786,"type":773,"children":-1},"西邮Linux兴趣小组2020纳新面试题题解","\u002F2022\u002Flinux-interview-2020","posts\u002F2022\u002Flinux-interview-2020","2022-11-20 13:57:19",1782091377117]