这个程序有什么问题?
#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" ?内存分配有什么问题?
这个程序有什么问题?
#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" ?内存分配有什么问题?
内存分配没有问题,只是内存永远不会被释放。在返回delete [] p;
之前不要忘记。main
输出的问题是p
指向的字符串没有终止符'\0'
。一般来说,您应该分配一个数组,其空间至少比您要放入数组中的字符多一个,并'\0'
在最后一个字符之后放置一个。当然,更好的解决方案是使用std::string
,它会为您处理所有这些。
C 字符串需要以空值结尾。再添加一个包含 0 的字节。
你可以这样分配存储char
使用new
,就可以了。但是,如果您稍后要使用与空终止字符相关的函数(例如strlen
ie,或将其打印出来),那么在为 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
。
首先,当你已经在使用 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;
}
您根本没有放置空字符。使用此代码:
#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;
}
当 endl 遇到 '\0' 时,它会返回,所以如果你在 char[] 中没有 '\0',直到找到它,它会继续读取内存。