C++ 我们可以声明指针的大小吗

C++ 我们可以声明指针的大小吗,c++,string,pointers,C++,String,Pointers,我们可以向指针声明大小吗 #include<iostream> #include<cstring> using namespace std; int main() { char (*ptr)=new char[3]; strcpy(ptr,"ert"); cout<<ptr<<endl; return 0; } #包括 #包括 使用名称空间std; int main() { 字符(*ptr)=新字符[3]; strcpy(ptr,“ert”);

我们可以向指针声明大小吗

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char (*ptr)=new char[3];
strcpy(ptr,"ert");
cout<<ptr<<endl;
return 0;
} 
#包括
#包括
使用名称空间std;
int main()
{
字符(*ptr)=新字符[3];
strcpy(ptr,“ert”);

您需要
4个
字符:

char *ptr=new char[4];
strcpy(ptr,"ert");
一个额外的空间用于:

此声明

char (*ptr)=new char[3];
strcpy(ptr,"ert");
首先在堆中分配3个元素的未命名字符数组,然后将数组的第一个元素的地址分配给指针ptr

不管您是按照上面的语句还是按照下面的方式初始化指针,指针的大小都不会改变

char (*ptr)=new char;
也就是说,
sizeof(ptr)
将是相同的,通常等于4或8字节,具体取决于编译程序的环境

C++不检查数组的边界

char (*ptr)=new char[3];
strcpy(ptr,"ert");

程序有未定义的行为,因为字符串literal
“ert”
有四个元素,包括终止零。

声明的不是指针的大小,而是指针指向的字符数组的大小

strcpy()
不知道指针指向的数组的长度-它只知道它有一个指向它可以复制到的第一个字节的指针,并且相信您知道有足够的空间进行复制。因此它非常快,但也相当危险,只有当您确定目标足够大时才应该使用它

strncpy()
对于一些额外的安全性是值得研究的,但是您仍然必须知道,目标指针指向的对象足够大,可以满足您指定的大小(它对源大小的保护大于对目标大小的保护)


这里的经验教训是C和C++不会给你任何帮助-编译器信任你要正确地缓冲你的缓冲区大小,并且不会在编译时或运行时做任何检查。这允许程序运行得非常快(没有运行时检查)。如果你在C++中使用你的标签,那么对于正常的字符串处理,你应该明确地使用<代码> STD::String 类,除非你有特殊的原因需要C风格的字符串处理。你可能不时有这样的理由,但是除非你H,否则不要这样做。发送至。

“ert”
实际上包含4个
char
。末尾有一个额外的nul终止。您最好使用
strncpy
之类的东西,因为它不知道您在运行时分配了多少字节,所以不必显示错误。您能详细解释一下吗。我说编译器没有显示错误,因为我只给出了长度3但是实际大小是4StrcPy,“String Read”,C++有STD::string,但是它里面仍然有C字符串,基本上是一个以“\\ 0”结尾的字符数组(ASCII 0 - null终止符)。因此,以这种方式使用strcpy将输入4个字符—“e”、“r”、“t”和“\0”以指示字符串的结尾。编译器完全有权诊断此错误……他们中的大多数人都不必麻烦。欢迎加入gcc团队并在此处添加诊断!
strncpy
在此处使用不是一个安全的函数,它只是替换了一个缓冲区在这种情况下,使用另一个索引的
strncpy
进行rflow实际上没有多大帮助。除了转换成一种不会成为这种事情牺牲品的语言之外,没有什么其他帮助。我怀疑这稍微超出了范围:)