错误的内存分配新char [n]

时间:2013-09-07 14:57:12

标签: c++ memory allocation

这个程序有什么问题?

#include<iostream>
using namespace std;
void main()
{

    int n = 5;
    char* p = new char [n];
    int i;
    for(i=0;i<n;i++)
    {
        p[i] = 'A'+i;
    }
    cout<<p<<endl;
}

为什么我得到“ABCDExxxx”而不是“ABCDE”? 内存分配有什么问题?

6 个答案:

答案 0 :(得分:5)

内存分配没有任何问题,只是内存永远不会被释放。在delete [] p;返回之前,请不要忘记main

输出问题是p指向的字符串没有终止'\0'。一般情况下,你应该为一个数组分配一个空间,至少比你要放入数组的字符多一个,并在最后一个之后放一个'\0'。当然,更好的解决方案是使用std::string,它会为您完成所有这些。

答案 1 :(得分:2)

C字符串需要以空值终止。再添加一个包含0的字节。

答案 2 :(得分:1)

您可以使用char这种方式为new分配存储空间,没关系。但是,如果您稍后将使用与null终止字符相关的函数(如strlen ie,或打印出来),那么在为char*分配存储时,您需要分配数量字符 + 1 更多来存储\0。 C字符串需要以空值终止。

  

为什么我得到“ABCDExxxx”而不是“ABCDE”?出什么问题了   内存分配?

您的数据不会以空值终止(最后不包含'\0',因此您要打印垃圾,直到在其他地方找到字符'\0'。为了使其按预期工作,您可以:

int n = 5;
char* p = new char [n+1];
p[n]='\0';

for(i=0;i<n;i++)
{
    p[i] = 'A'+i;
         ^
        side note: this is OK, however if your p has been pointing to a string 
        literal, i.e. if it was defined as  char*p = "string literal\n";
        then according to section 2.14.5 paragraph 11 of the C++ standard,
        it would invoke undefined behavior:
        The effect of attempting to modify a string literal is undefined.
        so be aware :p !

}
cout<<p<<endl;

记得然后用

取消分配存储空间

delete [] p;

正如其他人评论的那样,使用std::string代替它可能更好。

答案 3 :(得分:1)

首先,当你已经使用C ++时,不要使用C风格

使用std::string代替

它有一个成员函数c_str(),有助于使用C api / functions


#include<iostream>
using namespace std;
int main()
^^ main should return int
{

    int n = 5;
   //C string needs to be null terminated, so an extra
    char* p = new char [n+1];
    int i;
    for(i=0;i<n;i++)
    {
        p[i] = 'A'+i;
    }
    p[i] = '\0'; //Insert the null character
    cout<<p<<endl;
}

答案 4 :(得分:0)

你根本就没有放置空字符。使用此代码:

#include<iostream>
using namespace std;
void main()
{

    int n = 5;
    char* p = new char [n];
    int i;
    for(i=0;i<n;i++)
    {
        p[i] = 'A'+i;
    }
    cout<<p<<endl;
}

当您使用c ++时,我建议使用std::string

#include<iostream>
#include<string>
        using namespace std;
        void main()
        {

            //int n = 5;
            //char* p = new char [n];
            string s;
            int i;
            for(i=0;i<n;i++)
            {
                s.append("/*whatever string you want to append*/");
            }
            cout<<s<<endl;
        }

答案 5 :(得分:0)

当endl遇到'\ 0'时,它返回,所以如果你在char []中没有'\ 0',直到找到它,它将继续读取memoery。