user-0 提问: C语言代码优化问题？以下代码哪里有问题欢迎讨论。小白问题。

回复:
user: user-1
content: 动态分配的，和局部有什么关系?

user: user-2
content: “sndkkek”  （）/

user: user-3
content: 这期的时候就可以了

user: user-4
content: 个人建议，char a[]------->string                   数组---------->vector 我写的代码不好，那就用那些牛人写的代码吧

user: user-4

user: user-5
content: C语言代码优化 有多个 级别， 你 反汇编 一下 看看， 是 怎么优化的

user: user-6
content: 严重错误：返回局部变量的指针  memcpy，memncpy这两个函数可以连接下

user: user-7
content: 引用 12 楼 lin5161678 的回复:[quote=引用 11 楼 stherix 的回复:] char s[50]="\0";    //这个不能保证字符串s末尾有'\0'  这个不用谈了你还是谈谈吧  能还是不能  让我见识一下基础差的同学是怎么理解代码的  //s = "\0";   //这个地方是一个严重错误，导致内存泄露，因为s从堆上申请的空间，     //比如首地址是：0x001, s = "\0"这条语句就让s指向的"\0"字符串常量的地址，比如是0xff2，那么0x001的的地址就找不到，会导致内存泄露我也没说这段话说错 这不是给了 33.3分了么 全部是这段话的得分 [/quote]  我有点地方没看,对此抱歉 因为我只看了他的回复,没看他的代码注释 原作者代码严重问题主要是在函数里返回局部变量的值和改变了申请内存的指针  你说他的注释基本是错的,我就认为你说他的观点基本是错的 然而你又只引用了一处

user: user-8
content: 你这不是代码优化，而是代码找茬，三个函数都有严重错误。

user: user-9
content: 引用 11 楼 stherix 的回复: char s[50]="\0";    //这个不能保证字符串s末尾有'\0'  这个不用谈了你还是谈谈吧  能还是不能  让我见识一下基础差的同学是怎么理解代码的  //s = "\0";   //这个地方是一个严重错误，导致内存泄露，因为s从堆上申请的空间，     //比如首地址是：0x001, s = "\0"这条语句就让s指向的"\0"字符串常量的地址，比如是0xff2，那么0x001的的地址就找不到，会导致内存泄露我也没说这段话说错 这不是给了 33.3分了么 全部是这段话的得分

user: user-7
content: 引用 10 楼 lin5161678 的回复:[quote=引用 9 楼 stherix 的回复:] [quote=引用 8 楼 lin5161678 的回复:] 你加的注释基本写错了 引用 8 楼 lin5161678 的回复:char s[50]="\0";    //这个不能保证字符串s末尾有'\0' 的确保证了 50个字节全部是 0  不要抬杠,自己看你自己的原话,和你引用的东西[/quote]他给3个函数加了注释 结果只有最后一个函数的注释算说对  2/3说错 评价基本写错有什么不对?? 还得定量吗? 那就33.3分[/quote] 看你回了这么多的份上 我来一条一条给你解释吧  char s[50]="\0";    //这个不能保证字符串s末尾有'\0'  这个不用谈了 static char s[50]="\0";//这个不能保证字符串s末尾有'\0'   这个是保证可以为\0的,但是你引用的是上一条 //s = "\0";   //这个地方是一个严重错误，导致内存泄露，因为s从堆上申请的空间，     //比如首地址是：0x001, s = "\0"这条语句就让s指向的"\0"字符串常量的地址，比如是0xff2，那么0x001的的地址就找不到，会导致内存泄露  的确是严重错误,申请了内存,有把指针指向了其他地址,导致申请的内存永远也无法释放,更严重的是,他以为新指向的地址是内存分配过的 之后会导致可能应用程序崩溃

user: user-9
content: 引用 9 楼 stherix 的回复:[quote=引用 8 楼 lin5161678 的回复:] 你加的注释基本写错了 引用 8 楼 lin5161678 的回复:char s[50]="\0";    //这个不能保证字符串s末尾有'\0' 的确保证了 50个字节全部是 0  不要抬杠,自己看你自己的原话,和你引用的东西[/quote]他给3个函数加了注释 结果只有最后一个函数的注释算说对  2/3说错 评价基本写错有什么不对?? 还得定量吗? 那就33.3分

user: user-7
content: 引用 8 楼 lin5161678 的回复:你加的注释基本写错了 引用 8 楼 lin5161678 的回复:char s[50]="\0";    //这个不能保证字符串s末尾有'\0' 的确保证了 50个字节全部是 0  不要抬杠,自己看你自己的原话,和你引用的东西

user: user-9
content: 引用 5 楼 stherix 的回复:怀疑别人前,请先做好功课怀疑别人前,请先做好功课

user: user-9
content: 引用 5 楼 stherix 的回复:他写的没错 怀疑别人前,请先做好功课 就算 初始化的确不懂吧  static char s[50]="\0";//这个不能保证字符串s末尾有'\0' static 总懂了吧 静态存储 哪怕不初始化都有默认0  更何况还初始化了 怎么就不能保证末尾有'\0' ??

user: user-9
content: 引用 5 楼 stherix 的回复:他写的没错 怀疑别人前,请先做好功课 这样的常识 那么多人不懂吗? 初始化的时候 没指定的元素就是0  int arr[10] = {1}; arr[1]是 0  有疑问吗?  为什么换成char 就傻掉了?

user: user-7
content: 引用 4 楼 lin5161678 的回复:[quote=引用 3 楼 自信男孩 的回复:] #include <string.h> #include <stdio.h> #include <stdlib.h>  char *mid_1(char * ,int ,int); char *mid_2(char * ,int ,int); char *mid_3(char * ,int ,int); int main(void) {     char *p="https://zhidao.baidu.com/ihome/homepage/recommendquestion";     char *q;     printf("%s\n",mid_1(p,1,15));     printf("%s\n",mid_2(p,1,15));     printf("%s\n", q = mid_3(p,1,15));     free(q);     return 0; }  char *mid_1(char * str_,int start,int end){//自己写的MID函数     int i;     char s[50]="\0";    //这个不能保证字符串s末尾有'\0'     for(i=0;i<end;i++)         s[i]=str_[start+i-1];     s[i] = 0; //末尾加上'\0'     return s; } //自己写的MID函数 char *mid_2(char * str_,int start,int end) {     int i;     static char s[50]="\0";//这个不能保证字符串s末尾有'\0'     for(i=0;i<end;i++)         s[i]=str_[start+i-1];     s[i] = 0;    //末尾加上'\0'     return s; } char *mid_3(char * str_,int start,int end){//自己写的MID函数     int i;     char *s;     s=(char *)malloc(strlen(str_)* sizeof(char));     //s = "\0";   //这个地方是一个严重错误，导致内存泄露，因为s从堆上申请的空间，     //比如首地址是：0x001, s = "\0"这条语句就让s指向的"\0"字符串常量的地址，比如是0xff2，那么0x001的的地址就找不到，会导致内存泄露     for(i = 0; i < end; i++)         s[i]=str_[start+i-1];     s[i] = 0; //补上'\0'     return s; }  第一个返回了局部变量，结果是未定义的；局部变量的生命周期是从定义开始到函数调用结束而结束，因此到main里，这个变量就不存在了，结束了。 第二个和第三返回了静态变量和堆上的空间，可以正常返回。因为他们的生命周期是从定义开始到程序结束（静态变量）或者遇到free（堆上的空间）；  其他问题详见上面的代码注释你加的注释基本写错了 char s[50]="\0";    //这个不能保证字符串s末尾有'\0' 的确保证了 50个字节全部是 0 [/quote]  他写的没错 怀疑别人前,请先做好功课

user: user-10
content: 厉害，非常有用，感谢楼主

user: user-9
content: 引用 3 楼 自信男孩 的回复:#include <string.h> #include <stdio.h> #include <stdlib.h>  char *mid_1(char * ,int ,int); char *mid_2(char * ,int ,int); char *mid_3(char * ,int ,int); int main(void) {     char *p="https://zhidao.baidu.com/ihome/homepage/recommendquestion";     char *q;     printf("%s\n",mid_1(p,1,15));     printf("%s\n",mid_2(p,1,15));     printf("%s\n", q = mid_3(p,1,15));     free(q);     return 0; }  char *mid_1(char * str_,int start,int end){//自己写的MID函数     int i;     char s[50]="\0";    //这个不能保证字符串s末尾有'\0'     for(i=0;i<end;i++)         s[i]=str_[start+i-1];     s[i] = 0; //末尾加上'\0'     return s; } //自己写的MID函数 char *mid_2(char * str_,int start,int end) {     int i;     static char s[50]="\0";//这个不能保证字符串s末尾有'\0'     for(i=0;i<end;i++)         s[i]=str_[start+i-1];     s[i] = 0;    //末尾加上'\0'     return s; } char *mid_3(char * str_,int start,int end){//自己写的MID函数     int i;     char *s;     s=(char *)malloc(strlen(str_)* sizeof(char));     //s = "\0";   //这个地方是一个严重错误，导致内存泄露，因为s从堆上申请的空间，     //比如首地址是：0x001, s = "\0"这条语句就让s指向的"\0"字符串常量的地址，比如是0xff2，那么0x001的的地址就找不到，会导致内存泄露     for(i = 0; i < end; i++)         s[i]=str_[start+i-1];     s[i] = 0; //补上'\0'     return s; }  第一个返回了局部变量，结果是未定义的；局部变量的生命周期是从定义开始到函数调用结束而结束，因此到main里，这个变量就不存在了，结束了。 第二个和第三返回了静态变量和堆上的空间，可以正常返回。因为他们的生命周期是从定义开始到程序结束（静态变量）或者遇到free（堆上的空间）；  其他问题详见上面的代码注释你加的注释基本写错了 char s[50]="\0";    //这个不能保证字符串s末尾有'\0' 的确保证了 50个字节全部是 0

user: user-11
content: #include <string.h> #include <stdio.h> #include <stdlib.h>  char *mid_1(char * ,int ,int); char *mid_2(char * ,int ,int); char *mid_3(char * ,int ,int); int main(void) {     char *p="https://zhidao.baidu.com/ihome/homepage/recommendquestion";     char *q;     printf("%s\n",mid_1(p,1,15));     printf("%s\n",mid_2(p,1,15));     printf("%s\n", q = mid_3(p,1,15));     free(q);     return 0; }  char *mid_1(char * str_,int start,int end){//自己写的MID函数     int i;     char s[50]="\0";    //这个不能保证字符串s末尾有'\0'     for(i=0;i<end;i++)         s[i]=str_[start+i-1];     s[i] = 0; //末尾加上'\0'     return s; } //自己写的MID函数 char *mid_2(char * str_,int start,int end) {     int i;     static char s[50]="\0";//这个不能保证字符串s末尾有'\0'     for(i=0;i<end;i++)         s[i]=str_[start+i-1];     s[i] = 0;    //末尾加上'\0'     return s; } char *mid_3(char * str_,int start,int end){//自己写的MID函数     int i;     char *s;     s=(char *)malloc(strlen(str_)* sizeof(char));     //s = "\0";   //这个地方是一个严重错误，导致内存泄露，因为s从堆上申请的空间，     //比如首地址是：0x001, s = "\0"这条语句就让s指向的"\0"字符串常量的地址，比如是0xff2，那么0x001的的地址就找不到，会导致内存泄露     for(i = 0; i < end; i++)         s[i]=str_[start+i-1];     s[i] = 0; //补上'\0'     return s; }  第一个返回了局部变量，结果是未定义的；局部变量的生命周期是从定义开始到函数调用结束而结束，因此到main里，这个变量就不存在了，结束了。 第二个和第三返回了静态变量和堆上的空间，可以正常返回。因为他们的生命周期是从定义开始到程序结束（静态变量）或者遇到free（堆上的空间）；  其他问题详见上面的代码注释