重解几道华为经典C语言面试题
在C语言面试中,华为可能会提出一些经典的编程题目来测试应聘者的编程基础和对C语言的理解。以下是对题目中给出的几个例子的详细解析: 1. `void test1()` 函数: 这个函数中存在数组越界的问题。`strcpy`函数用于将一个字符串复制到另一个字符数组中。`string`数组大小为10,但`str1`字符串包含11个字符(包括结束符`\0`),因此调用`strcpy(string, str1)`会导致`string`数组越界。使用`strcpy`时,务必确保目标数组的大小大于源字符串的长度。 2. `void test2()` 函数: 这个函数有两个问题。`i`没有定义,这是一个编译错误。修复这个问题后,主要问题是`str1`没有添加结束符`\0`,导致`strcpy`函数无法正确识别字符串的结束。在for循环之后添加`str1[9] = '\0'`以使`str1`成为有效的字符串。 3. `void test3(char* str1)` 函数: 使用`strlen`函数获取字符串长度时,不包括结束符`\0`。因此,`if(strlen(str1)<=10)`可能导致数组越界。如果`strlen(str1)`的结果是10,加上结束符`\0`,字符串实际长度为11,复制到`string[10]`中会导致越界。 4. `DSN get_SRM_no()` 函数: 这个函数的目的是分配一个空闲的SRAM块。虽然题目中提到的for循环判断语句可能是后来添加的,但问题在于`SRM_no`在循环内部没有递增。每次循环都应该更新`SRM_no`的值,以便检查下一个SRAM块。 5. `int sum(int a)` 函数: 这个函数中,`c`是局部自动变量,每次调用都会被初始化为0;`b`是静态变量,其值会在函数调用之间保持。因此,`sum`函数的返回值每次增加2(`b`每次加2,`c`每次加1,但每次调用`c`都会重置为0)。所以,当`a=2`时,调用`sum`五次的输出应该是:8, 10, 12, 14, 16。 6. `int func(int a)` 函数: 这个函数的`switch`语句中,每个`case`都没有对变量`b`进行赋值,因此`return b;`将返回未定义的值。正确的做法是在每个`case`下面添加`b = ...`语句,如`case 1: b = 30; break;`等。 总结:这些题目主要考察了C语言中的字符串处理、数组操作、变量的作用域和生存期、循环控制以及`switch`语句的使用。理解并避免这些常见错误是C语言编程的基本要求。在实际编程中,要时刻注意数组边界、内存安全和变量状态等问题,以防止潜在的程序错误和安全隐患。














