分析下面代码有什么问题?
来源:互联网 发布:宁波二手房交易数据 编辑:程序博客网 时间:2024/05/01 13:28
分析下面代码有什么问题?
void test2() { char string[10], str1[10]; int i; for(i=0; i<10; i++) { str1 = 'a'; } strcpy( string, str1 ); }参考答案首先,
代码根本不能通过编译。因为数组名str1为 char *const类型的右值类型,根本不能赋值。
再者,即使想对数组的第一个元素赋值,也要使用 *str1 = ‘a’;
其次,对字符数组赋值后,使用库函数strcpy进行拷贝操作,strcpy会从源地址一直往后拷贝,直到遇到’\0’为止。所以拷贝的长度是不定的。如果一直没有遇到’\0’导致越界访问非法内存,程序就崩了。
完美修改方案为:
void test2(){ char string[10], str1[10]; int i; for(i=0; i<9; i++) { str1[i] = 'a'; } str1[9] = '\0'; strcpy( string, str1 );}
void test3(char* str1) { if(str1 == NULL){ return ; } char string[10]; if( strlen( str1 ) <= 10 ) { strcpy( string, str1 ); } }
参考答案
if(strlen(str1) <= 10)应改为if(strlen(str1) < 10),因为strlen的结果未统计’\0’所占用的1个字
void GetMemory( char *p ) { p = (char *) malloc( 100 ); } void Test( void ) { char *str = NULL; GetMemory( str ); strcpy( str, "hello world" ); printf( str ); }
参考答案
传入中Gemory( char *p )函数的形参为字符串指针,在函数内部修改形参并不能真正的改变传入形参的实参值,执行完
char *str = NULL;
GetMemory( str );
后的str仍然为NULL;
1:穿入形参并不能真正改变形参的值,执行完之后为空;
2:在函数GetMemory中和Test中没有malloc对应的free,造成内存泄露
char *GetMemory( void ) { char p[] = "hello world"; return p; } void Test( void ) { char *str = NULL; str = GetMemory(); printf( str ); }
参考答案
char “hello world”;
return p;
的p[]数组为函数内的局部自动变量,在函数返回后,内存已经被释放。这是许多程序员常犯的错误,其根源在于不理解变量的生存期
写出完整版的strcpy函数
参考答案
如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案:
2分
void strcpy( char *strDest, char *strSrc ) { while( (*strDest++ = * strSrc++) != ‘\0’ ); }
4分
void strcpy( char *strDest, const char *strSrc ) //将源字符串加const,表明其为输入参数,加2分 { while( (*strDest++ = * strSrc++) != ‘\0’ ); }
7分
void strcpy(char *strDest, const char *strSrc) { //对源地址和目的地址加非0断言,加3分 assert( (strDest != NULL) && (strSrc != NULL) ); while( (*strDest++ = * strSrc++) != ‘\0’ ); }
10分
//为了实现链式操作,将目的地址返回,加3分!
char * strcpy( char *strDest, const char *strSrc ) { assert( (strDest != NULL) && (strSrc != NULL) ); char *address = strDest; while( (*strDest++ = * strSrc++) != ‘\0’ ); return address;}
阅读全文
0 0
- 分析下面代码有什么问题?
- 求助!急!谁能帮我看一下,下面的代码有什么问题。谢谢
- 下面的代码有什么不妥之处
- 下面的代码有什么不妥之处?
- i++,判断下面两段代码有什么不同
- 下面的代码有什么不妥之处
- 下面的代码有什么不妥之处
- etc文件夹下面有什么
- 这段Java代码有什么问题???
- 下面程序有什么错误呢?
- composer下面composer.lock有什么用处?
- 看看下面JavaScript代码输出什么?
- 帮我看看我的代码有什么问题
- 这段代码有什么问题吗? 关于IHTMLLinkElement的。
- 求助:求大神帮忙,,,,看看代码有什么问题?
- 大家看看这段代码有什么问题
- stdafx有什么用(包含相关问题分析)
- stdafx有什么用(包含相关问题分析)
- 1. Two Sum
- 我的学习记录33
- shell脚本部分基础详解
- Throwable#initCause(Throwable) 方法
- ButterKnife
- 分析下面代码有什么问题?
- F
- 个人笔记——杂七杂八
- 关于VHDL的一些总结
- HDU2027 统计元音【入门】
- 【Tensorflow网络架构简单实现】 用Tensorflow实现VGG模型
- C++ Web 编程
- Androidstudio_Plugs
- Linux 文件结构 简介