为什么在 free store 上分配 char 会给出错误的值?

问题描述 投票:0回答:2

我正在免费存储上分配内存并将 char 放在该存储上,但是它在 char 的长输入中给出了一些意想不到的输出,并且在我的电脑上它给了我超过 1 个字符的输入的意想不到的结果,但是如果我在

delete [] p;
中注释掉
add_char()
,它给出了预期的结果。

查看 Godbolt 上的演示

#include <iostream>
#include <cstring>


char* add_char(char* p, char ch) 
{
    char* pc = new char[strlen(p) + 1];

    for (size_t i = 0; i <= strlen(p); ++i) {
        if (i == strlen(p))
            pc[i] = ch;

        else
            pc[i] = p[i];
    }

    delete[] p;
    return pc;
}
int main()
{
    char ch = 0; 
    char* pc = new char[1]{'a'};

    while (std::cin >> ch && ch != '!') {
        pc = add_char(pc, ch);

    }
    std::cout << "pc : " << pc << "\n";
    std::cout << strlen(pc) << "\n";;
}
c++ memory-management c++17
2个回答
2
投票

strlen
依赖于空字符
\0
来计算给定字符串的长度,因此您必须为两个初始值提供它:

char* pc = new char[]{'a', '\0'};

..并在将插入的字符一一附加时保留它:

const std::size_t newLength = strlen(p) + 1;
char* pc = new char[newLength];


for (size_t i = 0; i <= newLength; ++i) {
    if (i == newLength)
        pc[i] = '\0';

    if (i == newLength - 1)
        pc[i] = ch;
    else
        pc[i] = p[i];
}

P.S. 或者,您可以放弃使用

strlen
并在其他地方保留数组长度


0
投票

你没有为你的

char[]
字符串分配足够的内存,并且你没有正确地用
'\0'
终止它们。

试试这个:

#include <iostream>
#include <cstring>


char* add_char(char* p, char ch) 
{
    size_t len = strlen(p);
    char* pc = new char[len + 2]; // +1 for ch, +1 for terminator

    for (size_t i = 0; i < len; ++i) {
        pc[i] = p[i];
    }
    // alternatively:
    // strcpy(pc, p);

    pc[len+0] = ch;
    pc[len+1] = '\0';

    delete[] p;
    return pc;
}

int main()
{
    char* pc = new char[2]{'a', '\0'};

    char ch;
    while (std::cin >> ch && ch != '!') {
        pc = add_char(pc, ch);
    }

    std::cout << "pc : " << pc << '\n';
    std::cout << strlen(pc) << '\n';

    delete[] pc;
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.