可能重复:
What's the difference between new char[10] and new char(10)
之间有什么不同
char* t1=new char
和
char* t2=new char[10];
分配内存并且t1 [100] ='m'和t2 [100] ='m'对他们来说是正确的
-----------编辑后:
但是为什么我们可以使用t1 [100]如果t1被动态分配char而不是char数组
答案 0 :(得分:4)
您的第一个案例创建一个char
元素(1个字节),而您的第二个案例创建10个连续的char
个元素(10个字节)。但是,在两种情况下都未定义t(x)[100]='m'
的访问权限。也就是说,您在指针位置之后请求100个字节,这很可能是垃圾数据。
换句话说,你对'm'的赋值将覆盖已存在的任何内容,这可能是来自另一个数组的数据。因此,您可能会在运行时遇到一些奇怪的错误。
C / C ++允许程序员访问超出范围的数组,因为数组实际上只是指向连续内存的指针。约定t1[100]
只是指针后的100个字节,无论是什么。
如果您想要“安全”数组,请使用vector
类并调用at()
函数。如果访问无效,这将抛出out_of_range
异常。
Stroustrup给出了以下示例:
template<class T> class Vec : public vector<T> {
public:
Vec() : vector<T>() {}
Vec(int s) : vector<T>(s) {}
T& operator[] (int i) {return at(i);}
const T& operator[] (int i) const {return at(i);}
};
这个类是边界安全的。我可以这样使用它:
Vec<char> t3(10); // vector of 10 char elements
try {
char t = t3[100]; // access something we shouldn't
}
catch (out_of_range) {
cerr << "Error!" << endl; // now we can't shoot ourselves in the foot
}
答案 1 :(得分:3)
您需要delete
这些不同,因为数组是使用operator new
的不同变体分配的:
delete t1;
delete [] t2;
答案 2 :(得分:0)
t1指向动态分配的char; t2指向动态分配的10个字符的数组。但我相信这是C ++,而不是C.这绝对是重复的。
OP编辑后的修订
p [n]其中p是一个指针,n是一个整数,相当于*(p + n),因此它就像从你的p指向的那样访问100个字符。在你的两种情况下(t1和t2),第100个(第101个)元素超出了你的所有权,所以它是UB。实际上,上述事实使2[array]
可以与array[2]
互换。想要,但不要那样做:)