[{"data":1,"prerenderedAt":1227},["ShallowReactive",2],{"content:\u002F2022\u002Flinux-interview-2022":3,"surround:\u002F2022\u002Flinux-interview-2022":1216},{"id":4,"title":5,"body":6,"categories":1190,"date":1192,"description":108,"draft":1193,"extension":1194,"image":1195,"meta":1196,"navigation":1198,"path":1199,"permalink":1200,"published":1200,"readingTime":1201,"recommend":1200,"references":1200,"seo":1206,"sitemap":1207,"stem":1208,"tags":1209,"type":1213,"updated":1214,"__hash__":1215},"content\u002Fposts\u002F2022\u002Flinux-interview-2022.md","西邮Linux兴趣小组2022纳新面试题题解",{"type":7,"value":8,"toc":1171},"minimark",[9,71,76,88,99,109,115,123,127,138,175,215,221,225,251,278,318,324,350,356,366,372,392,396,407,414,423,427,447,453,468,474,488,491,494,500,516,536,540,556,559,565,569,600,638,642,678,719,723,731,751,759,763,777,783,787,797,800,806,860,877,883,889,893,904,934,938,948,951,957,960,966,979,982,985,989,1010,1016,1023,1029,1032,1038,1042,1086,1157],[10,11,12,44,57],"blockquote",{},[13,14,15,24,34,37],"ul",{},[16,17,18,19,23],"li",{},"本题目只作为 ",[20,21,22],"code",{"code":22},"Xiyou Linux 兴趣小组"," 2022 纳新面试的有限参考。",[16,25,26,27,33],{},"为节省版面，本试题的程序源码省去了 ",[20,28,31],{"className":29,"code":31,"language":32},[30],"language-c","#include","c"," 指令。",[16,35,36],{},"本试题中的程序源码仅用于考察C语言基础，不应当作为C语言「代码风格」的范例。",[16,38,39,40,43],{},"题目难度随机排列。\n所有题目编译并运行于 ",[20,41,42],{"code":42},"x86_64 GNU\u002FLinux"," 环境。",[45,46,47,48,51,52,56],"p",{},"学长寄语：",[49,50],"br",{},"\n长期以来，西邮Linux兴趣小组的面试题以难度之高名扬西邮校内。我们作为出题人也清楚的知道这份试题略有难度。请别担心。",[53,54,55],"strong",{},"若有同学能完成一半的题目，就已经十分优秀。"," 其次，相比于题目的答案，我们对你的思路和过程更感兴趣，或许你的答案略有瑕疵，但你正确的思路和对知识的理解足以为你赢得绝大多数的分数。最后，做题的过程也是学习和成长的过程，相信本试题对你更加熟悉的掌握C语言的一定有所帮助。祝你好运。我们FZ103见！",[45,58,59,60,62,63,70],{},"Copyright © 2022 西邮Linux兴趣小组, All Rights Reserved.",[49,61],{},"\n本试题使用采用 ",[64,65,69],"a",{"href":66,"rel":67},"http:\u002F\u002Fcreativecommons.org\u002Flicenses\u002Fby-nc-sa\u002F4.0\u002F",[68],"nofollow","知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议"," 进行许可。",[72,73,75],"h2",{"id":74},"_0-我的计算器坏了","0. 我的计算器坏了？！",[10,77,78],{},[45,79,80,83,84,87],{},[20,81,82],{"code":82},"2^10 = 1024"," 对应于十进制的4位，那么 ",[20,85,86],{"code":86},"2^10000"," 对应于十进制的多少位呢?",[45,89,90,91,94,95,98],{},"对于十进制数 ",[20,92,93],{"code":93},"d","，可以取其以10为底的对数，",[20,96,97],{"code":97},"[lg d] + 1"," 即为所求的位数。",[100,101,106],"pre",{"className":102,"code":104,"language":105},[103],"language-text","[lg 2^10] + 1 = [10 lg 2] + 1 = 4\n[lg 2^10000] + 1 = 3011\n","text",[20,107,104],{"__ignoreMap":108},"",[45,110,111,112,114],{},"当然，也可以使用Python，将 ",[20,113,86],{"code":86}," 转换为字符串并打印其长度解决。",[100,116,121],{"className":117,"code":119,"language":120,"meta":108},[118],"language-python","print(len(str(2 ** 10000))) # 3011\n","python",[20,122,119],{"__ignoreMap":108},[72,124,126],{"id":125},"_1-printf还能这么玩","1. printf还能这么玩？",[10,128,129,132],{},[45,130,131],{},"尝试着解释程序的输出。",[100,133,136],{"className":134,"code":135,"language":32,"meta":108},[30],"int main(void) {\n    if ((3 + 2 \u003C 2) > (3 + 2 > 2))\n        printf(\"Welcome to Xiyou Linux Group\\n\");\n    else\n        printf(\"%d\\n\", printf(\"Xiyou Linux Group - 2%d\", printf(\"\")));\n}\n",[20,137,135],{"__ignoreMap":108},[45,139,140,141,145,146,150,151,155,156,160,161,155,165,169,170,174],{},"先看 ",[20,142,144],{"className":143,"code":144,"language":32},[30],"if"," 语句，",[20,147,149],{"className":148,"code":149,"language":32},[30],"3 + 2 \u003C 2"," 为假返回 ",[20,152,154],{"className":153,"code":154,"language":32},[30],"0","，",[20,157,159],{"className":158,"code":159,"language":32},[30],"3 + 2 > 2"," 为真返回",[20,162,164],{"className":163,"code":164,"language":32},[30],"1",[20,166,168],{"className":167,"code":168,"language":32},[30],"0 > 1"," 为假，执行 ",[20,171,173],{"className":172,"code":173,"language":32},[30],"else"," 内的语句。",[45,176,177,178,181,182,186,187,191,192,196,197,200,201,196,205,209,210,214],{},"而 ",[20,179,173],{"className":180,"code":173,"language":32},[30]," 语句中，",[20,183,185],{"className":184,"code":185,"language":32},[30],"printf()"," 的返回值为打印字符串的长度，因此最内层的 ",[20,188,190],{"className":189,"code":190,"language":32},[30],"printf(\"\")"," 打印 ",[20,193,195],{"className":194,"code":195,"language":32},[30],"\"\""," 并返回其长度 ",[20,198,154],{"className":199,"code":154,"language":32},[30],"，中间层打印 ",[20,202,204],{"className":203,"code":204,"language":32},[30],"\"Xiyou Linux Group - 20\"",[20,206,208],{"className":207,"code":208,"language":32},[30],"22","，外层打印 ",[20,211,213],{"className":212,"code":213,"language":32},[30],"\"22\\n\"","，其结果为：",[100,216,219],{"className":217,"code":218,"language":105},[103],"Xiyou Linux Group - 2022\n",[20,220,218],{"__ignoreMap":108},[72,222,224],{"id":223},"_2-你好你好你好呀","2. 你好你好你好呀！",[10,226,227,245],{},[13,228,229,232],{},[16,230,231],{},"程序的输出有点奇怪，请尝试解释一下程序的输出吧。",[16,233,234,235,239,240,244],{},"请谈谈对 ",[20,236,238],{"className":237,"code":238,"language":32},[30],"sizeof()"," 及 ",[20,241,243],{"className":242,"code":243,"language":32},[30],"strlen()"," 的理解吧。",[100,246,249],{"className":247,"code":248,"language":32,"meta":108},[30],"int main(void) {\n    char p0[] = \"Hello,Linux\";\n    char *p1 = \"Hello,Linux\";\n    char p2[11] = \"Hello,Linux\";\n    printf(\"p0 == p1: %d, strcmp(p0, p2): %d\\n\", p0 == p1, strcmp(p0, p2));\n    printf(\"sizeof(p0): %zu, sizeof(p1): %zu, sizeof(*p2): %zu\\n\",\n           sizeof(p0), sizeof(p1), sizeof(*p2));\n    printf(\"strlen(p0): %zu, strlen(p1): %zu\\n\", strlen(p0), strlen(p1));\n}\n",[20,250,248],{"__ignoreMap":108},[45,252,253,257,258,262,263,267,268,272,273,277],{},[20,254,256],{"className":255,"code":256,"language":32},[30],"p0"," 是字符数组，以 ",[20,259,261],{"className":260,"code":261,"language":32},[30],"'\\0'"," 结尾，",[20,264,266],{"className":265,"code":266,"language":32},[30],"p1"," 是字符指针，指向常量区的一个字符串，",[20,269,271],{"className":270,"code":271,"language":32},[30],"p2"," 也是字符数组，但由于长度限制，没有结尾的标识符 ",[20,274,276],{"className":275,"code":276,"language":32},[30],"\\0","。",[45,279,280,281,284,285,288,289,293,294,277,297,301,302,305,306,309,310,313,314,317],{},"直接引用数组变量名时，返回的是数组首位的地址，直接引用指针名时，返回的是指针指向的地址。由于 ",[20,282,256],{"className":283,"code":256,"language":32},[30],"、",[20,286,266],{"className":287,"code":266,"language":32},[30]," 地址不同，因此 ",[20,290,292],{"className":291,"code":292,"language":32},[30],"p1 == p2"," 不为真，返回 ",[20,295,154],{"className":296,"code":154,"language":32},[30],[20,298,300],{"className":299,"code":300,"language":32},[30],"strcmp()"," 为字符串比较函数，从传入的两个地址参数开始向后读取字符并比较，直到出现不同的字符或者 ",[20,303,276],{"className":304,"code":276,"language":32},[30]," 为止，返回正数、负数或 0（相应字符的 ASCII 码之差有关），分别表示前者大、后者大、两者相等。当读到 ",[20,307,256],{"className":308,"code":256,"language":32},[30]," 的 ",[20,311,276],{"className":312,"code":276,"language":32},[30]," 时，此时 ",[20,315,271],{"className":316,"code":271,"language":32},[30]," 的下一个字符为内存中的随机值。因此打印的第一行为：",[100,319,322],{"className":320,"code":321,"language":105},[103],"p0 == p1: 0, strcmp(p0, p2): -72\n",[20,323,321],{"__ignoreMap":108},[45,325,326,330,331,334,335,339,340,344,345,349],{},[20,327,329],{"className":328,"code":329,"language":32},[30],"sizeof(p0)"," 是字符数组(含 ",[20,332,261],{"className":333,"code":261,"language":32},[30]," 以及未初始化的内容)的大小，",[20,336,338],{"className":337,"code":338,"language":32},[30],"sizeof(p1)"," 是指针所存地址的大小，",[20,341,343],{"className":342,"code":343,"language":32},[30],"sizeof(*p2)"," 是字符 ",[20,346,348],{"className":347,"code":348,"language":32},[30],"'H'"," 的大小。因此打印的第二行为：",[100,351,354],{"className":352,"code":353,"language":105},[103],"sizeof(p0): 12, sizeof(p1): 8, sizeof(*p2): 1\n",[20,355,353],{"__ignoreMap":108},[45,357,358,361,362,365],{},[20,359,243],{"className":360,"code":243,"language":32},[30]," 返回字符串的长度，从传入的地址参数开始读取，直到内存中的下一个 ",[20,363,261],{"className":364,"code":261,"language":32},[30]," 之前，返回读取的字符个数，",[100,367,370],{"className":368,"code":369,"language":105},[103],"strlen(p0): 11, strlen(p1): 11\n",[20,371,369],{"__ignoreMap":108},[45,373,374,375,378,379,382,383,387,388,391],{},"另外，由于 ",[20,376,271],{"className":377,"code":271,"language":32},[30]," 长度限制，数组内没有 ",[20,380,261],{"className":381,"code":261,"language":32},[30]," 作字符串结束的标识符，因此 ",[20,384,386],{"className":385,"code":386,"language":32},[30],"strlen(p2)"," 返回的是数组首位到内存随机内容的下一个 ",[20,389,261],{"className":390,"code":261,"language":32},[30],"，其返回值应该很大，具体结果视内存而定。",[72,393,395],{"id":394},"_3-换个变量名不行吗","3. 换个变量名不行吗？",[10,397,398,401],{},[45,399,400],{},"请结合本题，分别谈谈你对C语言中「全局变量」和「局部变量」的「生命周期」理解。",[100,402,405],{"className":403,"code":404,"language":32,"meta":108},[30],"int a = 3;\nvoid test() {\n    int a = 1;\n    a += 1;\n    {\n        int a = a + 1;\n        printf(\"a = %d\\n\", a);\n    }\n    printf(\"a = %d\\n\", a);\n}\nint main(void) {\n    test();\n    printf(\"a= %d\\n\", a);\n}\n",[20,406,404],{"__ignoreMap":108},[45,408,409,410,413],{},"打印第一个a的内容不符合预期，因为代码块作用域内的局部变量a在声明时遇到了 ",[20,411,412],{"code":412},"Undefined behavior","，a的值视具体的编译器、系统、平台而定。",[10,415,416],{},[45,417,418],{},[64,419,422],{"href":420,"rel":421},"https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F391088391",[68],"浅谈 C++ Undefined Behavior",[72,424,426],{"id":425},"_4-内存对不齐","4. 内存对不齐",[10,428,429,441],{},[45,430,431,435,436,440],{},[20,432,434],{"className":433,"code":434,"language":32},[30],"union"," 与 ",[20,437,439],{"className":438,"code":439,"language":32},[30],"struct"," 各有什么特点呢，你了解他们的内存分配模式吗。",[100,442,445],{"className":443,"code":444,"language":32,"meta":108},[30],"typedef union {\n    long l;\n    int i[5];\n    char c;\n} UNION;\ntypedef struct {\n    int like;\n    UNION coin;\n    double collect;\n} STRUCT;\nint main(void) {\n    printf(\"sizeof (UNION) = %zu\\n\", sizeof(UNION));\n    printf(\"sizeof (STRUCT) = %zu\\n\", sizeof(STRUCT));\n}\n",[20,446,444],{"__ignoreMap":108},[100,448,451],{"className":449,"code":450,"language":105},[103],"sizeof (long) = 4\nsizeof (int[5]) = 20\nsizeof (char) = 1\n",[20,452,450],{"__ignoreMap":108},[45,454,455,458,459,463,464,277],{},[20,456,434],{"className":457,"code":434,"language":32},[30]," 中的所有数据成员共享同一个存储空间，其在内存中的大小为最大成员的大小，因此 ",[20,460,462],{"className":461,"code":462,"language":32},[30],"UNION"," 的大小应该为 ",[20,465,467],{"className":466,"code":467,"language":32},[30],"20",[100,469,472],{"className":470,"code":471,"language":105},[103],"sizeof (int) = 4\nsizeof (UNION) = 20\nsizeof (double) = 8\n",[20,473,471],{"__ignoreMap":108},[45,475,476,479,480,463,484,277],{},[20,477,439],{"className":478,"code":439,"language":32},[30]," 中的每个数据成员享有独立的存储空间，其在内存中的大小为所有成员的大小之和。因此 ",[20,481,483],{"className":482,"code":483,"language":32},[30],"STRUCT",[20,485,487],{"className":486,"code":487,"language":32},[30],"32",[45,489,490],{},"真的是这样吗？",[45,492,493],{},"在计算机中，为了方便读取数据，内存中各数据的起始地址通常都是4或8的倍数。因此结果很可能如下：",[100,495,498],{"className":496,"code":497,"language":105},[103],"sizeof (UNION) = 24\nsizeof (STRUCT) = 40\n",[20,499,497],{"__ignoreMap":108},[10,501,502,509],{},[45,503,504],{},[64,505,508],{"href":506,"rel":507},"https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F30007037",[68],"C\u002FC++内存对齐详解 - 知乎专栏",[45,510,511],{},[64,512,515],{"href":513,"rel":514},"https:\u002F\u002Fdeveloper.ibm.com\u002Farticles\u002Fpa-dalign\u002F",[68],"Data alignment: Straighten up and fly right - IBM Developer",[13,517,518,527],{},[16,519,520,521],{},"若是4字节对齐：\n",[100,522,525],{"className":523,"code":524,"language":32,"meta":108},[30],"typedef union {\n    long l;         \u002F\u002F 0 ~ 3\n    int i[5];       \u002F\u002F 0 ~ 19\n    char c;         \u002F\u002F 0 ~ 7\n} UNION;            \u002F\u002F 0 ~ 19 -> 20\ntypedef struct {\n    int like;       \u002F\u002F 0 ~ 3\n    UNION coin;     \u002F\u002F 4 ~ 23\n    double collect; \u002F\u002F 23 ~ 30\n} STRUCT;           \u002F\u002F 0 ~ 31 -> 32\n",[20,526,524],{"__ignoreMap":108},[16,528,529,530],{},"若是8字节对齐：\n",[100,531,534],{"className":532,"code":533,"language":32,"meta":108},[30],"typedef union {\n    long l;         \u002F\u002F 0 ~ 3\n    int i[5];       \u002F\u002F 0 ~ 19\n    char c;         \u002F\u002F 0 ~ 7\n} UNION;            \u002F\u002F 0 ~ 23 -> 24\ntypedef struct {\n    int like;       \u002F\u002F 0 ~ 3\n    UNION coin;     \u002F\u002F 8 ~ 27\n    double collect; \u002F\u002F 32 ~ 39\n} STRUCT;           \u002F\u002F 0 ~ 39 -> 40\n",[20,535,533],{"__ignoreMap":108},[72,537,539],{"id":538},"_5-bitwise","5. Bitwise",[10,541,542,550],{},[13,543,544,547],{},[16,545,546],{},"请使用纸笔推导出程序的输出结果。",[16,548,549],{},"请谈谈你对位运算的理解。",[100,551,554],{"className":552,"code":553,"language":32,"meta":108},[30],"int main(void) {\n    unsigned char a = 4 | 7;\n    a \u003C\u003C= 3;\n    unsigned char b = 5 & 7;\n    b >>= 3;\n    unsigned char c = 6 ^ 7;\n    c = ~c;\n    unsigned short d = (a ^ c) \u003C\u003C 3;\n    signed char e = -63;\n    e \u003C\u003C= 2;\n    printf(\"a: %d, b: %d, c: %d, d: %d\\n\", a, b, c, (char)d);\n    printf(\"e: %#x\\n\", e);\n}\n",[20,555,553],{"__ignoreMap":108},[45,557,558],{},"按步骤执行：",[100,560,563],{"className":561,"code":562,"language":32,"meta":108},[30],"#include \u003Cstdio.h>\nint main(void) {\n    unsigned char a = 4 | 7;\n    \u002F\u002F a = 0000 0010 | 0000 0111 = 0000 0111 -> 7\n    a \u003C\u003C= 3;\n    \u002F\u002F a = 0011 1000 = 28\n    unsigned char b = 5 & 7;\n    \u002F\u002F b = 0000 0101 & 0000 0111 = 0000 0111 -> 7\n    b >>= 3;\n    \u002F\u002F b = 0000 0000 = 0\n    unsigned char c = 6 ^ 7;\n    \u002F\u002F c = 0000 0110 ^ 0000 0111 = 0000 0001 -> 1\n    c = ~c;\n    \u002F\u002F c = 1111 1110 -> (unsigned) 254\n    unsigned short d = (a ^ c) \u003C\u003C 3;\n    \u002F\u002F d = (0011 1000 ^ 1111 1110) \u003C\u003C 3\n    \u002F\u002F   = 1100 0110 \u003C\u003C 3\n    \u002F\u002F   = 0000 0110 0011 0000 -> 1584\n    signed char e = -63;\n    \u002F\u002F e = 1100 0001\n    e \u003C\u003C= 2;\n    \u002F\u002F e = 0000 0100\n\n    \u002F\u002F 作为char类型打印d，只保留低八位\n    \u002F\u002F (char)d = 0011 0000 -> 48\n    printf(\"a: %d, b: %d, c: %d, d: %d\\n\", a, b, c, (char)d);\n    \u002F\u002F 56, 0, 254, 48\n    printf(\"e: %#x\\n\", e);\n    \u002F\u002F 0x4\n    return 0;\n}\n",[20,564,562],{"__ignoreMap":108},[72,566,568],{"id":567},"_6-英译汉","6. 英译汉",[10,570,571,579],{},[45,572,573,574,578],{},"请说说下面数据类型的含义，谈谈 ",[20,575,577],{"className":576,"code":577,"language":32},[30],"const"," 的作用。",[580,581,582,588,594],"ol",{},[16,583,584,277],{},[20,585,587],{"className":586,"code":587,"language":32},[30],"char *const p",[16,589,590,277],{},[20,591,593],{"className":592,"code":593,"language":32},[30],"char const *p",[16,595,596,277],{},[20,597,599],{"className":598,"code":599,"language":32},[30],"const char *p",[580,601,602,613,627],{},[16,603,604,607,608,612],{},[20,605,587],{"className":606,"code":587,"language":32},[30]," 指 ",[20,609,611],{"className":610,"code":611,"language":32},[30],"*p"," 是个常量型字符指针，其中所存的地址不能改变。",[16,614,615,618,619,622,623,626],{},[20,616,593],{"className":617,"code":593,"language":32},[30]," 指字符指针 ",[20,620,611],{"className":621,"code":611,"language":32},[30]," 指向的字符是个常量，所指字符的内容不能改变，但可以改变 ",[20,624,611],{"className":625,"code":611,"language":32},[30]," 指向的地址。",[16,628,629,618,632,622,635,626],{},[20,630,599],{"className":631,"code":599,"language":32},[30],[20,633,611],{"className":634,"code":611,"language":32},[30],[20,636,611],{"className":637,"code":611,"language":32},[30],[72,639,641],{"id":640},"_7-汉译英","7. 汉译英",[10,643,644,651],{},[45,645,646,647,650],{},"请用变量 ",[20,648,45],{"className":649,"code":45,"language":32},[30]," 给出下面的定义:",[580,652,653,661,668],{},[16,654,655,656,660],{},"含有10个指向 ",[20,657,659],{"className":658,"code":659,"language":32},[30],"int"," 的指针的数组。",[16,662,663,664,667],{},"指向含有10个 ",[20,665,659],{"className":666,"code":659,"language":32},[30]," 数组的指针。",[16,669,670,671,674,675,277],{},"含有3个「指向函数的指针」的数组，被指向的函数有1个 ",[20,672,659],{"className":673,"code":659,"language":32},[30]," 参数并返回 ",[20,676,659],{"className":677,"code":659,"language":32},[30],[580,679,680,692,704],{},[16,681,655,682,685,686],{},[20,683,659],{"className":684,"code":659,"language":32},[30]," 的指针的数组。\n",[100,687,690],{"className":688,"code":689,"language":32,"meta":108},[30],"int *p[10];\n",[20,691,689],{"__ignoreMap":108},[16,693,663,694,697,698],{},[20,695,659],{"className":696,"code":659,"language":32},[30]," 数组的指针。\n",[100,699,702],{"className":700,"code":701,"language":32,"meta":108},[30],"int arr[10];\nint *p = (int*)arr;\n",[20,703,701],{"__ignoreMap":108},[16,705,670,706,674,709,712,713],{},[20,707,659],{"className":708,"code":659,"language":32},[30],[20,710,659],{"className":711,"code":659,"language":32},[30],"。\n",[100,714,717],{"className":715,"code":716,"language":32,"meta":108},[30],"int (*p[3])(int arg);\n",[20,718,716],{"__ignoreMap":108},[72,720,722],{"id":721},"_8-混乱中建立秩序","8. 混乱中建立秩序",[10,724,725,728],{},[45,726,727],{},"你对排序算法了解多少呢?\n请谈谈你所了解的排序算法的思想、稳定性、时间复杂度、空间复杂度。",[45,729,730],{},"提示：动动你的小手敲出来更好哦~",[13,732,733,742],{},[16,734,735,736],{},"冒泡排序\n",[100,737,740],{"className":738,"code":739,"language":32,"meta":108},[30],"void bubbleSort(int arr[], int len)\n{\n    int i, j, tmp;\n    for (i = 0; i \u003C len - 1; i++)\n        for (j = 0; j \u003C len - 1 - i; j++)\n            if (arr[j] > arr[j + 1])\n            {\n                tmp = arr[j];\n                arr[j] = arr[j + 1];\n                arr[j + 1] = tmp;\n            }\n}\n",[20,741,739],{"__ignoreMap":108},[16,743,744,745],{},"选择排序\n",[100,746,749],{"className":747,"code":748,"language":32,"meta":108},[30],"void selectionSort(int arr[], int len)\n{\n    int i, j;\n    for (i = 0; i \u003C len - 1; i++)\n    {\n        int min = i;\n        for (j = i + 1; j \u003C len; j++)\n            if (arr[j] \u003C arr[min])\n                min = j;\n        int tmp = arr[min];\n        arr[min] = &arr[i];\n        &arr[i] = tmp;\n    }\n}\n",[20,750,748],{"__ignoreMap":108},[10,752,753],{},[45,754,755],{},[64,756,757],{"href":757,"rel":758},"https:\u002F\u002Fgithub.com\u002Fhustcc\u002FJS-Sorting-Algorithm",[68],[72,760,762],{"id":761},"_9-手脑并用","9. 手脑并用",[10,764,765,768,771],{},[45,766,767],{},"请实现ConvertAndMerge函数：\n拼接输入的两个字符串，并翻转拼接后得到的新字符串中所有字母的大小写。",[45,769,770],{},"提示：你需要为新字符串分配空间。",[100,772,775],{"className":773,"code":774,"language":32,"meta":108},[30],"char* convertAndMerge(\u002F*补全签名*\u002F);\nint main(void) {\n    char words[2][20] = {\"Welcome to Xiyou \", \"Linux Group 2022\"};\n    printf(\"%s\\n\", words[0]);\n    printf(\"%s\\n\", words[1]);\n    char *str = convertAndMerge(words);\n    printf(\"str = %s\\n\", str);\n    free(str);\n}\n",[20,776,774],{"__ignoreMap":108},[100,778,781],{"className":779,"code":780,"language":32,"meta":108},[30],"#include \u003Cstdio.h>\n#include \u003Cstring.h>\nchar *convertAndMerge(char strs[2][20])\n{\n    char *result = (char *)malloc(sizeof(char) * 40);\n    strcpy(result, strs[0]);\n    strcat(result, strs[1]);\n    int len = strlen(strs[0]) + strlen(strs[1]);\n    for (int i = 0; i \u003C len; i++)\n    {\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{\n    char words[2][20] = {\"Welcome to Xiyou \", \"Linux Group 2022\"};\n    printf(\"%s\\n\", words[0]);\n    printf(\"%s\\n\", words[1]);\n    char *str = convertAndMerge(words);\n    printf(\"str = %s\\n\", str);\n    free(str);\n}\n",[20,782,780],{"__ignoreMap":108},[72,784,786],{"id":785},"_10-给你我的指针访问我的心声","10. 给你我的指针，访问我的心声",[10,788,789,791],{},[45,790,231],{},[100,792,795],{"className":793,"code":794,"language":32,"meta":108},[30],"int main(int argc, char **argv) {\n    int arr[5][5];\n    int a = 0;\n    for (int i = 0; i \u003C 5; i++) {\n        int *temp = *(arr + i);\n        for (; temp \u003C arr[5]; temp++) *temp = a++;\n    }\n    for (int i = 0; i \u003C 5; i++) {\n        for (int j = 0; j \u003C 5; j++) {\n            printf(\"%d\\t\", arr[i][j]);\n        }\n    }\n}\n",[20,796,794],{"__ignoreMap":108},[45,798,799],{},"运行后，程序的输出为：",[100,801,804],{"className":802,"code":803,"language":105},[103],"0       1       2       3       4\n25      26      27      28      29\n45      46      47      48      49\n60      61      62      63      64\n70      71      72      73      74\n",[20,805,803],{"__ignoreMap":108},[45,807,808,809,812,813,816,817,821,822,826,827,830,831,835,836,840,841,845,846,850,851,855,856,277],{},"程序在运行时，",[20,810,64],{"className":811,"code":64,"language":32},[30]," 是稳定自增的值，输出为此结果的原因是程序在每次循环时，将 ",[20,814,64],{"className":815,"code":64,"language":32},[30]," 的值从 ",[20,818,820],{"className":819,"code":820,"language":32},[30],"arr[i]"," 的起始（",[20,823,825],{"className":824,"code":825,"language":32},[30],"*temp = *(arr + i)","）赋值到数组的结尾。比如在第二次循环时，",[20,828,64],{"className":829,"code":64,"language":32},[30]," 从 ",[20,832,834],{"className":833,"code":834,"language":32},[30],"25"," 自增到 ",[20,837,839],{"className":838,"code":839,"language":32},[30],"44"," 的序列会从 ",[20,842,844],{"className":843,"code":844,"language":32},[30],"arr[1][0]"," 赋值到 ",[20,847,849],{"className":848,"code":849,"language":32},[30],"arr[4][4]","，覆盖了第一次循环后原先位置的 ",[20,852,854],{"className":853,"code":854,"language":32},[30],"5"," 到 ",[20,857,859],{"className":858,"code":859,"language":32},[30],"24",[45,861,862,863,867,868,872,873,876],{},"如果将循环条件中的 ",[20,864,866],{"className":865,"code":866,"language":32},[30],"temp \u003C arr[5]","，改为 ",[20,869,871],{"className":870,"code":871,"language":32},[30],"temp \u003C arr[i+1]","，程序在每次循环时就会只对 ",[20,874,820],{"className":875,"code":820,"language":32},[30]," 内的元素进行操作，如下。",[100,878,881],{"className":879,"code":880,"language":32,"meta":108},[30],"#include \u003Cstdio.h>\nint main(int argc, char **argv) {\n    int arr[5][5];\n    int a = 0;\n    for (int i = 0; i \u003C 5; i++) {\n        int *temp = *(arr + i);\n        for (; temp \u003C arr[i+1]; temp++) *temp = a++;\n    }\n    for (int i = 0; i \u003C 5; i++) {\n        for (int j = 0; j \u003C 5; j++) {\n            printf(\"%d\\t\", arr[i][j]);\n        }\n    }\n}\n",[20,882,880],{"__ignoreMap":108},[100,884,887],{"className":885,"code":886,"language":105},[103],"0       1       2       3       4\n5       6       7       8       9\n10      11      12      13      14\n15      16      17      18      19\n20      21      22      23      24\n",[20,888,886],{"__ignoreMap":108},[72,890,892],{"id":891},"_11-奇怪的参数","11. 奇怪的参数",[10,894,895,898],{},[45,896,897],{},"你了解argc和argv吗？\n直接运行程序argc的值为什么是1？\n程序会出现死循环吗？",[100,899,902],{"className":900,"code":901,"language":32,"meta":108},[30],"#include \u003Cstdio.h>\nint main(int argc, char **argv) {\n    printf(\"argc = %d\\n\", argc);\n    while (1) {\n        argc++;\n        if (argc \u003C 0) {\n            printf(\"%s\\n\", (char *)argv[0]);\n            break;\n        }\n    }\n}\n",[20,903,901],{"__ignoreMap":108},[45,905,906,910,911,915,916,919,920,923,924,928,929,933],{},[20,907,909],{"className":908,"code":909,"language":32},[30],"argc"," 指argument count，即参数计数器，",[20,912,914],{"className":913,"code":914,"language":32},[30],"argv"," 指argument vector，即参数数组。程序在运行时传入的第一个参数就是程序的启动路径\u002F文件名，因此 ",[20,917,909],{"className":918,"code":909,"language":32},[30]," 最小为",[20,921,164],{"className":922,"code":164,"language":32},[30],"。在循环中，",[20,925,927],{"className":926,"code":927,"language":32},[30],"int argc"," 会自增到溢出，然后打印 ",[20,930,932],{"className":931,"code":932,"language":32},[30],"argv[0]"," 即程序路径。",[72,935,937],{"id":936},"_12-奇怪的字符","12. 奇怪的字符",[10,939,940,942],{},[45,941,231],{},[100,943,946],{"className":944,"code":945,"language":32,"meta":108},[30],"int main(int argc, char **argv) {\n    int data1[2][3] = {{0x636c6557, 0x20656d6f, 0x58206f74},\n                       {0x756f7969, 0x6e694c20, 0x00000000}};\n    int data2[] = {0x47207875, 0x70756f72, 0x32303220, 0x00000a32};\n    char *a = (char *)data1;\n    char *b = (char *)data2;\n    char buf[1024];\n    strcpy(buf, a);\n    strcat(buf, b);\n    printf(\"%s \\n\", buf);\n}\n",[20,947,945],{"__ignoreMap":108},[45,949,950],{},"程序的输出为：",[100,952,955],{"className":953,"code":954,"language":105},[103],"Welcome to Xiyou Linux Group 2022\n",[20,956,954],{"__ignoreMap":108},[45,958,959],{},"文本在变量中的存储对应关系如下：",[100,961,964],{"className":962,"code":963,"language":32,"meta":108},[30],"\u002F\u002F                     c l e W       e m o     X   o t\nint data1[2][3] = {{0x636c6557, 0x20656d6f, 0x58206f74},\n                   \u002F\u002F  u o y i     n i L            \\0\n                   {0x756f7969, 0x6e694c20, 0x00000000}};\n\u002F\u002F                G   x u     p u o r     2 0 2             2\nint data2[] = {0x47207875, 0x70756f72, 0x32303220, 0x00000a32};\n\u002F\u002F unsigned char buf[33] = {\n\u002F\u002F     0x57, 0x65, 0x6C, 0x63, 0x6F, 0x6D, 0x65, 0x20, 0x74, 0x6F, 0x20, 0x58,\n\u002F\u002F     0x69, 0x79, 0x6F, 0x75, 0x20, 0x4C, 0x69, 0x6E, 0x75, 0x78, 0x20, 0x47,\n\u002F\u002F     0x72, 0x6F, 0x75, 0x70, 0x20, 0x32, 0x30, 0x32, 0x32};\n",[20,965,963],{"__ignoreMap":108},[45,967,968,969,973,974,978],{},"程序运行时，会把 ",[20,970,972],{"className":971,"code":972,"language":32},[30],"data[1]"," 和 ",[20,975,977],{"className":976,"code":977,"language":32},[30],"data[2]"," 中的字符串拼接起来，然后输出。",[45,980,981],{},"字符之所以“反向存储”，是因为在计算机中，为了方便某些设备的读取，采用了“小端序”(Little-endian)的存储方式：低位字节排放在内存的低地址端即该值的起始地址，高位字节排放在内存的高地址端。",[45,983,984],{},"与此相对的自然是“大端序”(Big-endian)，常见于文件存储、网络传输中。",[72,986,988],{"id":987},"_13-小试宏刀","13. 小试宏刀",[10,990,991,1004],{},[13,992,993,1001],{},[16,994,995,996,1000],{},"请谈谈你对 ",[20,997,999],{"className":998,"code":999,"language":32},[30],"#define"," 的理解。",[16,1002,1003],{},"请尝试着解释程序的输出。",[100,1005,1008],{"className":1006,"code":1007,"language":32,"meta":108},[30],"#define SWAP(a, b, t) t = a; a = b; b = t\n#define SQUARE(a) a *a\n#define SWAPWHEN(a, b, t, cond) if (cond) SWAP(a, b, t)\nint main() {\n    int tmp;\n    int x = 1;\n    int y = 2;\n    int z = 3;\n    int w = 3;\n    SWAP(x, y, tmp);\n    printf(\"x = %d, y = %d, tmp = %d\\n\", x, y, tmp);\n    if (x > y) SWAP(x, y, tmp);\n    printf(\"x = %d, y = %d, tmp = %d\\n\", x, y, tmp);\n    SWAPWHEN(x, y, tmp, SQUARE(1 + 2 + z++ + ++w) == 100);\n    printf(\"x = %d, y = %d\\n\", x, y, tmp);\n    printf(\"z = %d, w = %d, tmp = %d\\n\", z, w, tmp);\n}\n",[20,1009,1007],{"__ignoreMap":108},[100,1011,1014],{"className":1012,"code":1013,"language":105},[103],"x = 2, y = 1, tmp = 1\nx = 1, y = 2, tmp = 2\nx = 2, y = 2\nz = 5, w = 5, tmp = 2\n",[20,1015,1013],{"__ignoreMap":108},[45,1017,1018,1019,1022],{},"宏定义只是实现了",[53,1020,1021],{},"简单的文本替换","，不会自动为表达式补充圆括号或者为代码块补充花括号。因此，宏定义替换后等效于如下代码：",[100,1024,1027],{"className":1025,"code":1026,"language":32,"meta":108},[30],"#include \u003Cstdio.h>\nint main()\n{\n    int tmp;\n    int x = 1;\n    int y = 2;\n    int z = 3;\n    int w = 3;\n    \u002F\u002F SWAP(x, y, tmp);\n    tmp = x;\n    x = y;\n    y = tmp;\n    printf(\"x = %d, y = %d, tmp = %d\\n\", x, y, tmp);\n    \u002F\u002F x = 2, y = 1, tmp = 1\n    \u002F\u002F if (x > y) SWAP(x, y, tmp);\n    if (x \u003C y)\n        tmp = x;\n    \u002F\u002F 无论如何以下两行都执行\n    x = y;\n    y = tmp;\n    printf(\"x = %d, y = %d, tmp = %d\\n\", x, y, tmp);\n    \u002F\u002F x = 1, y = 2, tmp = 2\n    \u002F\u002F SWAPWHEN(x, y, tmp, SQUARE(1 + 2 + z++ + ++w) == 100);\n    \u002F\u002F 宏替换并不会为SQUARE()函数的参数加括号\n    if (1 + 2 + z++ + ++w * 1 + 2 + z++ + ++w == 100)\n        tmp = x;\n    x = y;\n    y = tmp;\n    printf(\"x = %d, y = %d\", x, y, tmp);\n    \u002F\u002F x = 2, y = 2\n    printf(\"z = %d, w = %d, tmp = %d\\n\", z, w, tmp);\n    \u002F\u002F z = 5, w = 5 ,tmp = 2\n}\n",[20,1028,1026],{"__ignoreMap":108},[45,1030,1031],{},"如此修改，便可令程序按预期执行。",[100,1033,1036],{"className":1034,"code":1035,"language":32,"meta":108},[30],"#include \u003Cstdio.h>\n#include \u003Cmath.h>\n#define SWAP(a, b, t) { t = a; a = b; b = t; }\n#define SQUARE(a) pow(a, 2)\n#define SWAPWHEN(a, b, t, cond) if (cond) { SWAP(a, b, t) }\nint main() {\n    int tmp;\n    int x = 1;\n    int y = 2;\n    int z = 3;\n    int w = 3;\n    SWAP(x, y, tmp);\n    printf(\"x = %d, y = %d, tmp = %d\\n\", x, y, tmp);\n    if (x > y) SWAP(x, y, tmp);\n    SWAPWHEN(x, y, tmp, SQUARE(1 + 2 + z++ + ++w) == 100);\n    printf(\"x = %d, y = %d\\n\", x, y, tmp);\n    printf(\"z = %d, w = %d ,tmp = %d\\n\", z, w, tmp);\n}\n",[20,1037,1035],{"__ignoreMap":108},[72,1039,1041],{"id":1040},"_14-gnulinux命令-选做","14. GNU\u002FLinux命令 (选做)",[10,1043,1044,1047,1050,1061,1083],{},[45,1045,1046],{},"你知道以下命令的含义和用法吗：",[45,1048,1049],{},"注：",[10,1051,1052],{},[45,1053,1054,1055,1057,1058,1060],{},"嘿！你或许对Linux命令不是很熟悉，甚至你没听说过Linux。",[49,1056],{},"\n但别担心，这是选做题，不会对你的面试产生很大的影响！",[49,1059],{},"\n了解Linux是加分项，但不了解也不扣分哦！",[13,1062,1063,1071,1077],{},[16,1064,1065],{},[20,1066,1069],{"className":1067,"code":1069,"language":1070},[1068],"language-sh","ls","sh",[16,1072,1073],{},[20,1074,1076],{"className":1075,"code":1076,"language":1070},[1068],"rm",[16,1078,1079],{},[20,1080,1082],{"className":1081,"code":1082,"language":1070},[1068],"whoami",[45,1084,1085],{},"请问你还了解哪些GNU\u002FLinux的命令呢。",[13,1087,1088,1098,1107,1118,1142],{},[16,1089,1090,1093,1094,1097],{},[20,1091,1069],{"className":1092,"code":1069,"language":1070},[1068]," 即 ",[20,1095,1096],{"code":1096},"list directory contents"," ，列出目前工作目录所含之文件及子目录（显示指定工作目录下之内容）。",[16,1099,1100,1093,1103,1106],{},[20,1101,1076],{"className":1102,"code":1076,"language":1070},[1068],[20,1104,1105],{"code":1105},"remove","，用于删除一个文件或者目录，慎用。",[16,1108,1109,1112,1113,1117],{},[20,1110,1082],{"className":1111,"code":1082,"language":1070},[1068]," 用来打印当前执行操作的用户名，与此相似的 ",[20,1114,1116],{"className":1115,"code":1116,"language":1070},[1068],"who am i"," 则用来打印登陆当前 Linux 系统的用户名。",[16,1119,1120,1121,284,1125,284,1129,284,1133,284,1137,1141],{},"实用的文件工具有 ",[20,1122,1124],{"className":1123,"code":1124,"language":1070},[1068],"mv",[20,1126,1128],{"className":1127,"code":1128,"language":1070},[1068],"touch",[20,1130,1132],{"className":1131,"code":1132,"language":1070},[1068],"mkdir",[20,1134,1136],{"className":1135,"code":1136,"language":1070},[1068],"cp",[20,1138,1140],{"className":1139,"code":1140,"language":1070},[1068],"chmod"," 等。",[16,1143,1144,1145,284,1149,284,1153,1141],{},"实用的网络工具有 ",[20,1146,1148],{"className":1147,"code":1148,"language":1070},[1068],"nc",[20,1150,1152],{"className":1151,"code":1152,"language":1070},[1068],"netstat",[20,1154,1156],{"className":1155,"code":1156,"language":1070},[1068],"ping",[10,1158,1159],{},[45,1160,1161,1162,1164,1165,1167,1168,1170],{},"恭喜你做到这里！你的坚持战胜了绝大多数看到这份试题的同学。",[49,1163],{},"\n或许你自己对答题的表现不满意，但别担心，请自信一点呐。",[49,1166],{},"\n坚持到达这里已经证明了你的优秀。",[49,1169],{},"\n还在等什么，快带上你的笔记本电脑，来FZ103面试吧!",{"title":108,"searchDepth":1172,"depth":1172,"links":1173},4,[1174,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189],{"id":74,"depth":1175,"text":75},2,{"id":125,"depth":1175,"text":126},{"id":223,"depth":1175,"text":224},{"id":394,"depth":1175,"text":395},{"id":425,"depth":1175,"text":426},{"id":538,"depth":1175,"text":539},{"id":567,"depth":1175,"text":568},{"id":640,"depth":1175,"text":641},{"id":721,"depth":1175,"text":722},{"id":761,"depth":1175,"text":762},{"id":785,"depth":1175,"text":786},{"id":891,"depth":1175,"text":892},{"id":936,"depth":1175,"text":937},{"id":987,"depth":1175,"text":988},{"id":1040,"depth":1175,"text":1041},[1191],"开发","2022-11-19 22:32:46",false,"md","https:\u002F\u002Fassets.zhilu.cyou\u002Fcover2\u002Flinux-interview-2022.jpg",{"slots":1197},{},true,"\u002F2022\u002Flinux-interview-2022",null,{"text":1202,"minutes":1203,"time":1204,"words":1205},"20 min read",19.97,1198200,3994,{"title":5,"description":108},{"loc":1199},"posts\u002F2022\u002Flinux-interview-2022",[1210,1211,1212],"Linux社团","面试题","C语言","tech","2023-07-30 11:45:33","VQwxaXWelUDFeobA_osLv09Ms2nRNwjUMIn8JndwWl4",[1217,1222],{"title":1218,"path":1219,"stem":1220,"date":1221,"type":1213,"children":-1},"西邮网安技能赛WriteUp","\u002F2022\u002Fctf-xupt-skill","posts\u002F2022\u002Fctf-xupt-skill","2022-11-05 23:13:52",{"title":1223,"path":1224,"stem":1225,"date":1226,"type":1213,"children":-1},"西邮Linux兴趣小组2021纳新面试题题解","\u002F2022\u002Flinux-interview-2021","posts\u002F2022\u002Flinux-interview-2021","2022-11-20 12:52:52",1782091377169]