1

这个程序有什么问题?

#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" ?内存分配有什么问题?

4

6 回答 6

5

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

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

于 2013-09-07T14:59:58.907 回答
2

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

于 2013-09-07T14:59:38.790 回答
1

你可以这样分配存储char使用new,就可以了。但是,如果您稍后要使用与空终止字符相关的函数(例如strlenie,或将其打印出来),那么在为 a 分配存储时,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

于 2013-09-07T15:04:13.340 回答
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;
}
于 2013-09-07T15:05:47.907 回答
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;
        }
于 2013-09-07T15:05:10.727 回答
0

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

于 2013-09-07T15:13:26.300 回答