华为C语言笔试题解析与常见错误

需积分: 3 20 下载量 10 浏览量 更新于2024-10-25 收藏 31KB DOC 举报
"这篇资料包含了2007年华为公司针对C语言的笔试题目及解答,旨在帮助面试者准备华为的面试。" 华为C语言笔试题目的解析: 1. 查找错误: 在`test1()` 函数中,错误在于没有正确地为字符串分配足够的空间。`string` 被定义为长度为10的字符数组,但尝试存储一个长度为10的字符串(包括结束符`\0`),会导致丢失字符串的结束符。正确的做法是定义`string`为长度为11的数组:`char string[11];` 在`test2()` 函数中,`strcpy()` 使用不当。`str1` 没有被赋予字符串结束符`\0`,这会导致`strcpy()`在内存中盲目地复制,可能会引起越界访问。解决方法是在循环结束后添加`str1[9]='\0';` `test3()` 函数中,`strcpy()` 的使用同样存在问题。`strlen(str1)` 不计算结束符,因此当`str1`恰好有10个字符时,`string`不会得到结束符。应将条件更改为`strlen(str1)<10`来确保空间足够。 2. 查找错误: 宏定义`MAX_SRM256DSNget_SRM_no()` 中,`SRM_no` 没有被初始化。由于使用了`static`关键字,其值会在每次调用函数时保留,导致函数变为非重入的,结果不可预测。要修复此问题,应移除`static`声明,使得`SRM_no`在每次调用时都重新初始化。 3. 编程题: 函数`sum(int a)` 包含两个局部变量,`c`是自动变量,每次调用都会初始化为0;`b`是静态变量,其值在函数调用之间保持。在`main()`函数中,`for`循环5次调用`sum()`,`b`的值会累加2,`c`的值会增加5。所以,对于`a`=2的情况,`sum()`在第一次调用时返回`2 + 3 + 1 = 6`,第二次调用返回`2 + 5 + 2 = 9`,以此类推,直到第五次调用,返回`2 + 9 + 5 = 16`。 通过这些题目,我们可以了解到C语言中字符串处理、内存管理、变量作用域以及函数调用的基本规则。同时,它强调了对程序安全性和可维护性的关注,这对于任何编程面试都是非常重要的。