动态字符串分配如何工作?

问题描述

#include<bits/stdc++.h>
using namespace std;

int main()
{
    char *one;
    one = new char[1];
    cin.getline(one,5);
    cout<<one<<endl;
    return 0;
}

这应该为字符指针* 1分配1个字节空间或1个字符空间。现在我使用cin.getline输入5个字符,为什么它只输出前4个字符而不是5个?以及为什么我只分配了1个字符的空间而不能只输出1个字符?

我尝试使用

for(int i = 0; one[i] != '\0'; ++i) cout<<one[i];

它执行相同的操作,它输出我输入的前4个字符,而不是5个字符。我希望它只存储1个字符,因为我只分配了1个字节的空间。

解决方法

为什么只输出前4个字符而不是5个字符?

因为您的程序具有未定义的行为。

而且也是因为getline(char * s,std::streamsize count)从流中读取的字符数最多少于count,因此将空字符附加到它所写的内容上。

我希望它只存储1个字符,因为我只分配了1个字节空间。

您不能使用cin.getline来做到这一点。终止符必须有空格。

#include <iostream>

int main()
{
    char* one = new char[1];
    std::cin.get(*one);
    std::cout << *one << std::endl;
    return 0;
}

此外:这里的动态分配似乎是多余的。为什么不char one;