收录日期:2019/07/17 13:08:28 时间: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. 现实中,建议楼主不要采取这种处事的态度,因为这样会让人失去真心想帮你的朋友。

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

请帮我走出迷茫 请大家谈谈Java必学类容及其学习顺序 反码问题 求一个比较复杂的数据库语句。请高手 指点。在线等 如何现实建立一个通用的二叉树吗? MediaElement使用内存资源问题 SQL放注入过滤规则探讨 关于“未将对象引用设置到对象的实例”的问题 完了,我我我我我我也喜欢上了一个美女,怎么办啊 session 失效,记录用户的退出时间 请问各位朋友,ASP.NET如何自动发送Email问题 CMFCBUTTON 如何设置字体 请教文件打包的函数(linux下) 两个电脑,怎么样实现资源共享? LNK2019错误不断,望同行进来指点指点! 喜欢技术的请进 使用jquery的validate插件时,equalTo判断两个表单值是否相等,造成浏览器假死的情况 求解答MOSS2007搜索问题 webBrowser1 C# api读取 MFC程序 listView中的内容 求助:使用spring ioc注入管理,spring aop做日志记录……内详! 怎么把数据库里的数据导成电子表格 初学者的一个小问题 如何优化数据查询统计,有图 深圳月薪多少才算是白领? 这个错误是什么意思?VC++调试错误 各位大侠,请教小有没有写服务去调用程序的例子。 UdpClient.Receive方法的编码问题 JPivot+Mondrian怎么解决中文乱码 基于对话框的托盘程序图标的切换问题?在全局函数里实现切换!