收录日期:2020/05/29 15:34:12 时间:2016/08/25 19:02:32 标签:C语言

指出下面程序的错误之处,并说明原因。
char *function(void *a,int b){
int i=0;
char k[30]="hello world !";
while(*a&&i<b){
*a++=k[i++]
}
a[i]='\0';
return k;
}
首先提醒一下:发代码一定要用代码括起来,别人容易看....
其次:这段代码有什么用?都不知道有什么用的话,怎么找错误? 只有语法错误才能在不知道代码用途的情况下找错误!!逻辑错误是基本不可能的.

你总不能够先叫别人理解了你这段错误的代码的用途,再提出错误的地方吧?

简单说几点吧:

char *function(void *a,int b){//大括号应该另起一行开头写(纯个人建议,可以无视)
                              //为什么 a 是 void* 呢?而不是 char* 呢? (这个不算问题)
int i=0;
char k[30]="hello world !";
while(*a&&i<b){  //1)对于 void* 来说, 判断 *a 是否等于 0 有意义么? 你应该是判断 k[i] 才对吧?
                         // 2) 还是之前那句, 大括号建议另起一行.
                         // 3) 建议加多几个空格和括号,看起来舒服很多的.比如: while(*a && (i < b))
*a++=k[i++]    // 1) 缺少 ;
                    // 2) 程序段在开头没有对 a!=NULL进行判断,如果a==NULL,程序立即崩溃.
                    //    (当然,这个可能也是你故意为之,如果是,当我没说.)
                    // 3) 假如你这个程序的意思是复制字符串的话,那么如果 b>30 怎么办?一大堆乱码了.
                    // 4) 这句语句,我个人建议还是分开几句来写,特别是初学者.一条语句中应该避免同时出现多个 ++ 
                    //    不然如果用错的话,错误很难找出来的.
}
a[i]='\0';
return k;//绝对不可以返回局部指针变量,所以,我觉得,你这里应该是 return a; 
                 //不过,要注意, a 是 void* ,而你返回的类型是 char* 
}


我这个是复制的  我不知道怎么排版啊
根本错误就是返回了局部变量k的地址。
void*不能直接解引用

返回局部数组也是个错误
return k
请先说明下你复制了一段程序在自己的电脑上运行时是想表达什么意思呢。
3楼说到点上了
引用 3 楼  的回复:
根本错误就是返回了局部变量k的地址。


++
这个程序本身就是错的   我知道  我只是想发上来让大家找茬的   你们说的我也知道 只是想看看这个程序还有什么我不知道的错误
三楼正解!
引用 9 楼  的回复:
这个程序本身就是错的   我知道  我只是想发上来让大家找茬的   你们说的我也知道 只是想看看这个程序还有什么我不知道的错误


你这不是调戏我们吗?
一楼都把错误所在讲出来了,如果不对参数进行检查的话真的是很危险的事情

引用 1 楼  的回复:
首先提醒一下:发代码一定要用代码括起来,别人容易看....
其次:这段代码有什么用?都不知道有什么用的话,怎么找错误? 只有语法错误才能在不知道代码用途的情况下找错误!!逻辑错误是基本不可能的.

你总不能够先叫别人理解了你这段错误的代码的用途,再提出错误的地方吧?

简单说几点吧:

C/C++ code

char *function(void *a,int b){//大括号……


测试一下怎么发代码,大家不用理我

char *function(void *a,int b){//大括号应该另起一行开头写(纯个人建议,可以无视)
                              //为什么 a 是 void* 呢?而不是 char* 呢? (这个不算问题)
    int i=0;
    char k[30]="hello world !";
    while(*a&&i<b){  //1)对于 void* 来说, 判断 *a 是否等于 0 有意义么? 你应该是判断 k[i] 才对吧?
                         // 2) 还是之前那句, 大括号建议另起一行.
                         // 3) 建议加多几个空格和括号,看起来舒服很多的.比如: while(*a && (i < b))
        *a++=k[i++]    // 1) 缺少 ;
                    // 2) 程序段在开头没有对 a!=NULL进行判断,如果a==NULL,程序立即崩溃.
                    //    (当然,这个可能也是你故意为之,如果是,当我没说.)
                    // 3) 假如你这个程序的意思是复制字符串的话,那么如果 b>30 怎么办?一大堆乱码了.
                    // 4) 这句语句,我个人建议还是分开几句来写,特别是初学者.一条语句中应该避免同时出现多个 ++ 
                    //    不然如果用错的话,错误很难找出来的.
    }
    a[i]='\0';
    return k;//绝对不可以返回局部指针变量,所以,我觉得,你这里应该是 return a; 
                 //不过,要注意, a 是 void* ,而你返回的类型是 char* 
}
但是我有个疑问,即使返回的是局部变量指针的时,也不会报错,只是说:在调用完函数后,局部变量K的值会变释放掉,从而再是使用该地址时,所指向的值会变成不确定之外,好像没有什么错误!
引用 9 楼  的回复:
这个程序本身就是错的   我知道  我只是想发上来让大家找茬的   你们说的我也知道 只是想看看这个程序还有什么我不知道的错误


1. 如果9楼以前的那些回复中指出的问题,楼主都很清楚的话,你就根本必要提出这个问题,浪费大家的感情:)
2. 个人感觉楼主不够厚道。其实1楼指出了代码中的问题(明显人家是很用心回答的),为啥不给人家分呢?再说无满意结贴,你自己也得不到反馈的一半分数,有点损己不利人哈。如果我是楼主,我可能会继续问:为什么不能返回局部变量的指针?不过依照楼主的做法,可能即便有人回答得中肯,也未必能得到分数,因为你也可能会说“你们说的我也知道 只是想看看这个程序还有什么我不知道的错误”。
3. 现实中,建议楼主不要采取这种处事的态度,因为这样会让人失去真心想帮你的朋友。

以上建议仅供参考。
貌似惹众怒了哈    我并不知道无满意结贴  会造成这个样子  我是新来的 很多规矩都不知道  见谅呐   不好意思  !

高难度问题.老鸟才进来,关于动态分配虚拟内存 一个关于关键字查找的问题 急!!! 请问如何将 TFont 保存到流 请问,哪里有swt/JFace的api帮助文档下载 有关模板的问题~ 网页中滚动显示的文字如何复制下来? 怎么用c++ 文件流来实现以追加方式从一个文件拷贝数据到另一个文件呢? 新手的菜鸟问题 关于vc6.0和vc.net转换的错误 Linux环境下如何安装gcc? 大哥小问题不懂请帮个忙吧想不开拉@@!!~~!!!@~ |M| 在某一时段让网站执行某一事件的问题大家都说用webservice 但这个东西我从来没有用过也没有了解过,哪位好心人帮说说怎么搞 一个看似基础的问题,劳驾各位高手解答一下 请教,在picturebox中同时使用mouseup和mousemove遇到的问题 升级BIOS后机子不能启动,怎么办? 日期判断问题 他妈的,我快崩溃了,到底怎么在MSDN上查阅Win32 API 的资料呀 ASP程序中,搜索页的翻页错误!(附代码)急急急!!! 大哥小问题不懂请帮个忙吧想不开拉@@!!~~!!!@~ 请教,如何将写代码实现下面这两个DOS的命令的功能? 按日期命名文件的名称 一个关于新闻发布系统的小问题! 求助=====求助啊求助 --求助SQL问题--写对给分 求助啊==求助 工具箱上的控件无法拉动问题。急! 靠,HTTP缓存的一点有价值详细的中文资料都搜不到..... 求高手帮我改改。。这是我网站的新闻采集程序。。 点击一个页面调转后tomcat就停止了,为什么啊? 求助:先装.net后装iis,但运行注册命令之后aspx文件打开仍然报错\"名称含无效字符\"