为什么此程序打印带有奇怪字符的字符串?尽管释放内存泄漏?

我是C语言的初学者,并将其作为大学课程的一部分进行学习。给我们的实践问题之一是要求我们创建一个函数,该函数返回用户定义的字符串,该字符串前后带有连字符('-')字符。用户还将定义字符总数。该函数将被称为“ center”,并将被调用如下:center(char userString [],totalLength)。因此,如果userString =“ cat”且totalLength = 5,则center应该返回“ -cat-”。

中心功能可以正常工作。它创建一个带有连字符的字符串。但是,当尝试打印时,我在输出中看到奇怪的字符。在讲座中有人告诉我有关内存泄漏的信息,但是我尝试分配和释放内存。

中心功能:

char *center(char s[],int totalLength){
    int dashes = totalLength-strlen(s);

    int i;
    char* ret=malloc(totalLength+1);
    int left = dashes/2;


    for(i=0; i<left; i++){
        ret[i]='-';

    }
    for(i=left;i<strlen(s)+1;i++){
        ret[i]=s[i-left];

    }
    for(i=strlen(s)+left;i<totalLength;i++){
        ret[i]='-';

    }
    ret[totalLength+1]='\0';
    return ret;
}

主要功能:

int main(void) {
    char s[] = "cat";
    char *ret=malloc(100);
    ret = center(s,5);
    printf("%s\n",ret);
    free(ret);
    ret = center(s,6);
    printf("%s\n",7);
    printf("%s\n",ret);
    free(ret);
    return 0;
}

实际输出:

-cat-
-cat--o
--ca└--

预期输出:

-cat-
-cat--
--cat--
mjg1mlf2 回答:为什么此程序打印带有奇怪字符的字符串?尽管释放内存泄漏?

char* ret=malloc(totalLength+1);
...
ret[totalLength+1]='\0';

数组的最高索引比大小小一。大小为totalLength+1的缓冲区的索引从0totalLength。错误放置的\0解释了第2行中的结尾垃圾(o)。

for(i=left;i<strlen(s)+1;i++)
//                    ^^
for(i=strlen(s)+left;i<totalLength;i++)
//             ^^^^^

+1+left应该相同,以确保后面的循环在较早的循环停止的地方开始。不匹配是其中一个错误的信号,它导致未初始化字符之间存在间隙,这就是为什么在第3行的中间看到垃圾()的原因。

本文链接:https://www.f2er.com/3163085.html

大家都在问