69,369
社区成员
发帖
与我相关
我的任务
分享
#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);
main()
{
char *p="https://zhidao.baidu.com/ihome/homepage/recommendquestion";
printf("%s\n",mid_1(p,1,15));
printf("%s\n",mid_2(p,1,15));
printf("%s\n",mid_3(p,1,15));
return 0;
}
char *mid_1(char * str_,int start,int end){//自己写的MID函数
int i;
char s[50]="\0";
for(i=0;i<end;i++) s[i]=str_[start+i-1];
return s;
}
char *mid_2(char * str_,int start,int end){//自己写的MID函数
int i;
static char s[50]="\0";
for(i=0;i<end;i++) s[i]=str_[start+i-1];
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";
for(i=0;i<end;i++) s[i]=str_[start+i-1];
return s;
}
char s[50]="\0"; //这个不能保证字符串s末尾有'\0' 这个不用谈了
你还是谈谈吧
能还是不能
让我见识一下基础差的同学是怎么理解代码的
//s = "\0"; //这个地方是一个严重错误,导致内存泄露,因为s从堆上申请的空间,
//比如首地址是:0x001, s = "\0"这条语句就让s指向的"\0"字符串常量的地址,比如是0xff2,那么0x001的的地址就找不到,会导致内存泄露
我也没说这段话说错
这不是给了 33.3分了么 全部是这段话的得分
[/quote]
我有点地方没看,对此抱歉
因为我只看了他的回复,没看他的代码注释
原作者代码严重问题主要是在函数里返回局部变量的值和改变了申请内存的指针
你说他的注释基本是错的,我就认为你说他的观点基本是错的
然而你又只引用了一处char s[50]="\0"; //这个不能保证字符串s末尾有'\0' 这个不用谈了
你还是谈谈吧
能还是不能
让我见识一下基础差的同学是怎么理解代码的
//s = "\0"; //这个地方是一个严重错误,导致内存泄露,因为s从堆上申请的空间,
//比如首地址是:0x001, s = "\0"这条语句就让s指向的"\0"字符串常量的地址,比如是0xff2,那么0x001的的地址就找不到,会导致内存泄露
我也没说这段话说错
这不是给了 33.3分了么 全部是这段话的得分
static char s[50]="\0";//这个不能保证字符串s末尾有'\0'
static 总懂了吧
静态存储 哪怕不初始化都有默认0
更何况还初始化了
怎么就不能保证末尾有'\0' ??char s[50]="\0"; //这个不能保证字符串s末尾有'\0'
的确保证了 50个字节全部是 0
[/quote]
他写的没错
怀疑别人前,请先做好功课char s[50]="\0"; //这个不能保证字符串s末尾有'\0'
的确保证了 50个字节全部是 0
#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;
}