C语言面试趣谈:找错题解析

1 下载量 20 浏览量 更新于2024-09-02 收藏 71KB PDF 举报
"C语言学习趣事与经典面试题解析" 在C语言的学习过程中,经常会遇到一些有趣的现象和挑战性的面试题。本篇内容主要探讨了两道常见的C语言面试题,涉及字符串处理和数组操作的基本知识。 第一道面试题: ```c void test1() { char string[10]; char* str1 = "0123456789"; strcpy(string, str1); } ``` 在这个例子中,初看似乎没有问题,但其实存在潜在的内存越界风险。`strcpy()`函数用于复制字符串,但必须确保目标字符串`string`有足够的空间容纳源字符串`str1`。源字符串的长度(不包括结束的`\0`)是10,而`string`仅能容纳9个字符加上结束符,导致越界。为了避免这种情况,可以自定义一个更安全的`StrCpy`函数: ```c int StrCpy(const char* source, char dest[]) { if (NULL == source || NULL == dest || (strlen(dest) < strlen(source))) return 1; // 返回值=1表示复制失败 else strcpy(dest, source); return 0; // 返回值=0表示复制成功 } ``` 第二道面试题: ```c void test2() { char string[10], str1[10]; int i; for (i = 0; i < 10; i++) { str1 = 'a'; } strcpy(string, str1); } ``` 此题考察了多个知识点。首先,`str1`是一个数组名,它代表数组的首地址,是常量,不能作为左值进行赋值。其次,不能通过`str1 = 'a';`这样的方式一次性赋值给所有数组元素。正确的做法应使用下标访问数组元素,如`str1[i] = 'a';`。此外,`strcpy`在此处同样存在越界问题。修复后的代码可能如下: ```c void test2() { char string[10] = {'\0'}, str1[10] = {'\0'}; int i; for (i = 0; i < 10; i++) { str1[i] = 'a'; } str1[i] = '\0'; // 添加结束符 strcpy(string, str1); } ``` 这两道面试题展示了C语言中对字符串和数组操作的严谨性,提醒我们在编程时必须注意内存安全和边界条件。在实际开发中,了解这些基础知识并避免常见错误是至关重要的。学习C语言不仅需要理解语法,还需要深入理解内存管理和指针概念,这样才能编写出高效且安全的代码。对于求职者而言,掌握这些经典面试题的答案,将有助于在面试中脱颖而出。