这个程序有什么问题?
#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”? 内存分配有什么问题?
答案 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。