关于char * ,为什么输出的长度超过用malloc 分配给的长度
一个计算最长回文字串的函数,问题代码在中间注释了,输入测试用例 为s="dddddddd"
char longestPalindrome(char s) {
char *longest=NULL; int max=0;
int tempmax=0;
int i=0,j=0,left,right;
int n=strlen(s);
for(i=0;i<n;i++){
for(j=n-1;j>=i;j--){
tempmax=0;
for(left=i,right=j;right>=left;right--,left++){
if(s[left]==s[right]){
tempmax+=2;
}else{
break;
}
}
if(left==right+1){
if(tempmax>max){
max=tempmax;
printf("max=%d\n",max);
int ini;
longest=(char*)malloc(max*sizeof(char));
for(ini=0;ini<max;ini++){
longest[ini]='\0';
}
int _i=0,_j=j-i;
for(;_i<=_j;_i++){
//问题代码如下,分配的长度为max=8,在最后一步技术后longest的长度变成了11 为什么?
printf("former%d,",strlen(longest));
longest[_i]=s[i+_i];
printf("%c,",s[i+_i]) ;
printf("latter%d\n",strlen(longest));
}
}
}
else if(left==right+2){
tempmax-=1;
if(tempmax>max){
max=tempmax;
longest=(char*)malloc(sizeof(char)*max);
int _i=0,_j=j-i;
for(;_i<=_j;_i++){
longest[_i]=s[i+_i];
}
}
}
}
}
return longest;
}
回答:
longest=(char*)malloc(max*sizeof(char));
问题应该是出在这句代码。你分配的长度和你max相等,那么longest里面刚好就放满了字符串s,并没有实现你想要在longest最后加上'\0'的想法。(你底下的for循环应该就是这个意思吧?)所以修改为:
longest=(char*)malloc((max+1)*sizeof(char));
另:
char longestPalindrome(char s)
这个函数传入的参数是有问题的,你的目标是传入一个字符串,但你这个定义只是传入了一个字符。还有你返回的是一个字符指针,但是你定义的是返回一个字符。修改为:
char * longestPalindrome(char *s) or char * longestPalindrome(char s[n]) //n为大于你想传入的字符串长度的某个数。
看来你没太懂我的意思,我主要是想让你知道,你使用malloc函数分配的内存不够,没有位置放'\0',所以导致字符串后面的'\0'是随机的,,而strlen函数是读到'\0'才会停止,就出现了这个错误。
我测试了一下。
测试一:
int main(void){
int max = 8;
char s[] = "dddddddd";
char *longest;
int ini;
longest=(char*)malloc(max*sizeof(char));//此处分配空间大小为max
// for(ini=0;ini<max;ini++) //注释掉初始化。
// longest[ini]='\0';
int _i=0,_j=7;
for(;_i<=_j;_i++)
{
//问题代码如下,分配的长度为max=8,在最后一步技术后longest的长度变成了11 为什么?
printf("former%d,",strlen(longest));
longest[_i]=s[_i];
printf("%c,",s[_i]);
printf("latter%d\n",strlen(longest));
}
return 0;
}
运行结果如图
看到前面的former这一列没有?因为没有对空间进行'\0'初始化,因为随机出错。
测试2:
int main(void){
int max = 8;
char s[] = "dddddddd";
char *longest;
int ini;
longest=(char*)malloc(max*sizeof(char));//此处分配空间大小为max
for(ini=0;ini<max;ini++)//进行初始化
longest[ini]='\0';
int _i=0,_j=7;
for(;_i<=_j;_i++)
{
//问题代码如下,分配的长度为max=8,在最后一步技术后longest的长度变成了11 为什么?
printf("former%d,",strlen(longest));
longest[_i]=s[_i];
printf("%c,",s[_i]);
printf("latter%d\n",strlen(longest));
}
return 0;
}
运行结果如图
注意前面这一列,结果是不是正常了?因为你进行了初始化。
测试三:
int main(void){
int max = 8;
char s[] = "dddddddd";
char *longest;
int ini;
longest=(char*)malloc((max+1)*sizeof(char));//此处分配空间大小为max+1
// for(ini=0;ini<max;ini++)
// longest[ini]='\0';
for(ini=0;ini<max+1;ini++)//进行初始化
longest[ini]='\0';
int _i=0,_j=7;
for(;_i<=_j;_i++)
{
//问题代码如下,分配的长度为max=8,在最后一步技术后longest的长度变成了11 为什么?
printf("former%d,",strlen(longest));
longest[_i]=s[_i];
printf("%c,",s[_i]);
printf("latter%d\n",strlen(longest));
}
return 0;
}
运行结果如图:
是不是得到想要的结果了?
回答:
strlen()
是计算从第一个字符到'0'直接字符数量(不包括'0'),这和你malloc
多少空间是没关系的。如果没有遇到\0
的话,它会继续寻找,直到找到\0
。你的代码可能是某个地方有bug,导致在不正确的位置添加了\0
。
以上是 关于char * ,为什么输出的长度超过用malloc 分配给的长度 的全部内容, 来源链接: utcz.com/p/194572.html