注:以下都是找错题(即:找出程序中的错误或不合理的地方)
一、

void test1()
{char string[10];char* str1 = "0123456789";strcpy(string, str1);
}

解答:字符串str1有11个字节(包括末尾的结束符’\0’),而数组string只有10个字节,故而使用strcpy函数将str1复制到string中会导致数组string越界一个字节,可能导致系统崩溃。

题外:
使用如下例程探究一下strcpy函数复制字符串时是否会把’\0’也一并复制过去。

int main(void)
{unsigned char str1[10] = {0};unsigned char* str2="123";int i=0;memset(str1,0xff,sizeof(str1));for(i=0;i<10;i++){printf("%X ",str1[i]);}printf("\r\n");strcpy(str1,str2);for(i=0;i<10;i++){printf("%X ",str1[i]);}printf("\r\n");
}

结果:

可见strcpy函数复制字符串时会把’\0’也一并复制过去。

上面这个测试记录一个小问题
一开始unsigned char str1[10] = {0};用的是char型的,导致%X输出来每个元素是0xFFFFFFFF,与设想的0xFF不符,究其原因是%x要求的是无符号整形变量,而如果传入的是char型,这里有一个整数提升的问题。char作为有符号数,提升到无符号整数,由于char的值为0xFF,那么提升时,前面的填充位为1。所以提升后其值为0xFFFFFFFF
解决办法:
把char类型强制转换为uint8_t(即unsigned char),使用uint8_t时,是无符号提升,前面的填充为0,所以提升后的值为0xFF

二、

void test2()
{char string[10], str1[10];int i;for(i=0; i<10; i++){str1= 'a';}strcpy(string, str1);
}

解答:str1[10]是局部变量,没有初始化可能元素都是随机数,因此str1[]里可能没有没有结束符’\0’,strcpy函数是把含有’\0’结束符的字符串source(包含’\0’)复制到另一个地址空间destin。故而使用strcpy复制时很可能导致数组越界引起系统崩溃。

三、

void test3(char* str1)
{char string[10];if(strlen(str1) <= 10 ){strcpy(string, str1);}
}

解答:应修改为if (strlen(str1) < 10),因为strlen的结果未统计最后的结束符’\0’,如果str1恰好是11个字节的字符串包含最后的’\0’,使用strcpy时会导致string写入越界。

四、

void GetMemory(char *p)
{p = (char *)malloc( 100 );
}void Test( void )
{char *str = NULL;GetMemory(str);strcpy(str,"hello world");printf(str);
}

解答:C语言中的函数参数为传值参数,在函数内对形参的修改并不能改变对应实参的值。故而调用GetMemory后,str的值没有改变,仍为NULL。这里完成功能要用二级指针。
另外一个错误,没有释放内存。
正确的应改为:

void GetMemory(char **p)
{*p=(char *)malloc(100);
}void Test( void )
{char *str = NULL;GetMemory(&str);strcpy(str,"hello world");printf(str);free(str);str=NULL;
}

评析:
(1)目的:通过调用子函数,为主函数指针分配一块内存空间;

在调用GetMemory时,实参值为&str,即指针str的地址;GetMemory执行时,分配临时变量p=&str; p=(char)malloc(100)操作等同于:str=(char*)malloc(100);即通过调用子函数,为主函数指针分配一块内存空间。

(2)注意:如果malloc函数被调用,则后续函数中一定需要有free将对应的内存释放,否则可能导致内存泄露;当free§后,需要让p=NULL,否则指针p会成为野指针!

五、

char *GetMemory( void )
{char p[] = "hello world";return p;
}
void Test( void )
{char *str = NULL;str = GetMemory();printf(str);
}

解答:GetMemory中,p数组为局部变量,在函数返回后,该数组空间被释放。故而str指向被释放的地址空间,可能打印乱码。实测如下:

六、

void GetMemory( char **p, int num )
{*p = (char *)malloc(num);
}void Test( void )
{char *str = NULL;GetMemory(&str, 100);strcpy(str, "hello");printf(str);
}

解答:试题6避免了试题4的问题,但在GetMemory内,未对p为NULL情况的判断。当p不为NULL时,在printf后,也未对malloc的空间进行free。

七、

void Test( void )
{char *str = (char *)malloc( 100 );strcpy(str, "hello" );free(str);... //省略的其它语句
}

解答:未对str为NULL的情况的判断,在free(str)后,str未设置为NULL,可能变成一个野指针(后面对str的操作可能会导致踩内存)。

八、

swap(int* p1,int* p2)
{int *p;*p = *p1;*p1 = *p2;*p2 = *p;
}

解答:上述函数功能,p1和p2指向的int数进行值互换
在swap函数中,p是个野指针,*p操作将导致程序运行的崩溃。故而,程序应改为:

swap(int* p1,int* p2)
{int p;p = *p1;*p1 = *p2;*p2 = p;
}

C语言面试题分享(6)相关推荐

  1. C语言面试题分享(5)

    一.下列程序的执行结果是_________. #include <stdio.h>union un {int i;char c[2]; };void main() { union un x ...

  2. C语言面试题分享(3)

    一.用变量a给出下面的定义 a) 一个整型数(An integer) int a; b) 一个指向整型数的指针(A pointer to an integer) int*a; c) 一个指向指针的的指 ...

  3. C语言面试题分享(2)

    一.sizeof 和 strlen 有何区别? 分析: sizeof 是一个操作符,strlen 是库函数. sizeof 的参数可以是数据的类型,也可以是变量,而 strlen 只能以结尾为'\0' ...

  4. C语言面试题分享(1)

    一.用预处理指令#define 声明一个常数,用以表明一年中有多少秒.(忽略闰年问题) #define SECOND_PER_YEAR (606024*365)UL 分析: #define语法的基本常 ...

  5. 华为js面试题_华为C语言面试题最优思路及答案分享

    原标题:华为C语言面试题最优思路及答案分享 华为校招15道C语言面试题分享 用预处理指令#define 声明一个常数, 用以表明1年中有多少秒 (忽略闰年问题) 一 题 #defineSECONDS_ ...

  6. 神州数码笔试题C语言,神州数码程序类笔试题分享

    神州程序类笔试题分享: 神州数码笔试1)description of the students table: sid_id number start_date date end_date date w ...

  7. c语言程序设计试题及答案十,C语言程序设计试题试题及答案.doc

    <C语言程序设计试题试题及答案.doc>由会员分享,可在线阅读,更多相关<C语言程序设计试题试题及答案.doc(49页珍藏版)>请在装配图网上搜索. 1.C ,C+(120)1 ...

  8. Python培训之就业面试题分享

    近几年,学习Python编程的人越来越多,大家对于Python编程技术非常感兴趣,想要转型到这个行业,下面小编为大家整理一份Python找工作的面试题分享,希望能够帮助正在找Python工作的小伙们. ...

  9. c语言大学程序设计题库,黑龙江大学C语言程序设计试题库程序单选

    <黑龙江大学C语言程序设计试题库程序单选>由会员分享,可在线阅读,更多相关<黑龙江大学C语言程序设计试题库程序单选(5页珍藏版)>请在人人文库网上搜索. 1.黑龙江大学C语言程 ...

最新文章

  1. ASP.NET Web Pages – 文件夹简介
  2. eclipse中统计代码行数
  3. 【性能优化实战】java嵌入式开发pos
  4. python 海象运算符,Python3.8新特性-- 海象操作符
  5. 51nod 1102 面积最大的矩形 新疆大学OJ 1387: B.HUAWEI's billboard 【单调栈】+【拼凑段】(o(n) 或 o(nlog(n))
  6. 2019牛客暑期多校训练营(第一场)E题 ABBA(DP)
  7. C语言的main函数,究竟有几种写法?
  8. 牛牛牛!干翻Sci-hub!
  9. [Android Pro] listView和GridView的item设置的高度和宽度不起作用
  10. php readfile cookie,python处理cookie详解
  11. 《Java就业培训教程》_张孝祥_书内源码_07
  12. CDSN文章转载方法
  13. 鸿蒙开发板Hi3861_驱动0.95_oled显示屏ssd1306_code-2.0-CANARY_双显示屏效果
  14. 从事汽车电子软件开发需要什么技能?
  15. 基带信号传输之码间串扰
  16. matlab latex emf 乱码,latex 使用中的一些问题
  17. PHP设置表格框线,ppt中表格边框线条怎样设置?
  18. 访问 github.com 的请求遭到拒绝您未获授权,无法查看此网页解决办法
  19. Vue2 - 网易云音乐项目笔记(基于Vant UI组件库)
  20. 获取某一年指定自然周的开始时间和结束时间

热门文章

  1. “新基建”沙龙(一)精华回顾 | 5G与工业互联网的发展机遇与挑战
  2. Nginx:作为缓存,支持Range回源
  3. ioctl , fcntl socket操作详解
  4. boost::fast_pool_allocator
  5. redis 6379端口telnet不通的解决办法
  6. java基础---IO转换流
  7. leetcode 1504. Count Submatrices With All Ones | 1504. 统计全 1 子矩形(单调栈)
  8. 左神算法:判断 t1 树是否包含t2 树全部的拓扑结构(剑指 Offer 26. 树的子结构,Java版)
  9. 【Android开发】文本框、按钮、文本编辑框、提交登录、单选框
  10. C++ iterator迭代器