关于char * ,为什么输出的长度超过用malloc 分配给的长度

查看:160
本文介绍了关于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;
}

运行结果如图:

是不是得到想要的结果了?

这篇关于关于char * ,为什么输出的长度超过用malloc 分配给的长度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆