关于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

回到顶部