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

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

请问Digester类的作用是什么? 怎么用asp连接oracle的数据库DB??写出代码好吗?急着给分呀。 初学者:CWnd类是干什么用的? data控件中如何实现SQL(作业,急!) 新年了,衷心地祝大家事事顺心!! 我还以为在最后几天可以拿到五个角呢,可惜只差几十分,遗憾中,散分.我甚至怀疑CSDN计分有点不准. 不登陆域也能通过域控制器上internet 为什么? 过年啦,新年快乐啊~! rs.recordcout问题! 845主板开机故障 一个人过元旦的进来,祝所有的单身贵族元旦快乐! 简单的文件指针问题! 各位,新年快乐,请问哪儿有JBuilder的参考书籍下载?送100分 新年将至,祝大家赚钱多的都拿不动!! 數據匯入的麻煩 各位高手能提供一个简单的bmp模式的ejb的例子么,数据库oracle 如何将记录的更改保存到数据库? 请问二进制文件如何打开? 为程序员正名:程序员比妓女好! 索取IE WebControl TreeView ToolBar……的本地文档 好久没有来了,给大家问个好! 如何使用openwebmail中的 auth_mysql? csdn的树型菜单,怎么做,高分 系统开发的估价问题,欢迎各位赐见! win2000的快速启动工具栏放在哪个文件夹下? 请问大侠,在SCO Unix下如何获取命令文件的绝对路径 谁知道卓越的薪水怎样?顺便祝大家明年再上一个台阶! 请问在Linux下如何设置socket的消息队列的大小? 公司qq被封了,不能聊天,郁闷中!!! 硬盘有坏扇区怎么修复???逻辑上的哦!