我们可以声明一个指针的大小

时间:2014-12-22 10:36:01

标签: 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;
} 

这行的含义是什么char * ptr = new char [3]如果它将大小分配给ptr.since我将大小设为3,字符串为&#34; ert&#34;它必须显示错误,因为字符串长度太长但它没有。我们可以为指针分配大小,如果是这样的话?

3 个答案:

答案 0 :(得分:1)

您需要4个字符:

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

nul terminator的一个额外空间:

|e|r|t|\0| 

答案 1 :(得分:0)

本声明

char (*ptr)=new char[3];

首先在堆中使用3个元素分配未命名的字符数组,然后将数组的第一个元素的地址分配给指针ptr。

无论是在上面的语句中还是按照以下方式初始化指针,都不会更改指针的大小

char (*ptr)=new char;

sizeof( ptr )将是相同的,通常等于4或8个字节,具体取决于编译程序的环境。

C ++不检查数组的边界。所以在这个声明中

strcpy(ptr,"ert");

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

答案 2 :(得分:0)

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

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

strncpy()值得研究一些额外的安全性,但你仍然必须知道目标指针指向足够大的东西以达到你指定的大小(它保护的数量远远大于源的大小)目标)。

这里要学到的教训是C和C ++不会给你任何帮助 - 编译器相信你可以正确地获得缓冲区大小,并且不会在编译时或运行时代表你做任何检查。这允许程序运行得非常快(没有运行时检查),但也需要程序员更加小心。如果您使用C ++编写标签所建议的内容,那么对于正常的字符串处理,您绝对应该使用std::string类,除非您有特定的理由需要C样式的字符串处理。你可能会不时有这样的理由,但除非必须这样做,否则不要这样做。