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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了此程序为什么打印带有奇怪字符的字符串?尽管释放了内存泄漏?相关的知识,希望对你有一定的参考价值。

我是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]='';
    return ret;
}

主要功能:

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

实际输出:

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

预期输出:

-cat-
-cat--
--cat--
答案
char* ret=malloc(totalLength+1);
...
ret[totalLength+1]='';

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

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

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

以上是关于此程序为什么打印带有奇怪字符的字符串?尽管释放了内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

在二叉搜索树程序 Codeblock 正在打印奇怪的字符

打印自定义字符串数据时的奇怪输出(c ++新手)

为啥以文本形式打开图像文件会打印出奇怪的字符?

从特定字节的文件中读取的额外奇怪字符

奇怪的行为释放APK离子

当我用单引号将字符串括起来时,C++ std::cout 打印奇怪的字符[重复]