不像在C语言中,正如我对C的了解,在C中没有realloc
指令,因为这是不推荐的.但是当我创建一个函数,它连接字符串,同时可以动态地重新分配给定字符串的内存,而不使用vector
时,我需要一些代码,就像realloc
指令一样,所以我想到的是,使用指针的引用(在代码char* &des
中)可以通过使用C++的常用指令new
和delete
来调整内存大小。但是,出现错误:“[Error]从'char '类型的右值初始化'char&'类型的非常数引用无效”为什么不能用char*
类型初始化char*&
类型?这不是和char* &des = str0
语句一样吗?代码如下:
void Mystrcat(char* &des, const char* src) {
int des_len = Mystrlen(des); // Mystrlen just returns the length of a string with the type unsigned int excluding null character
int src_len = Mystrlen(src);
char* temp_str = des;
des = new char[des_len + src_len + 1];
//a copy process
for(int i = 0; i < des_len; i++) {
des[i] = *(temp_str + i);
}
for(int i = des_len + 1; i < des_len + src_len + 1; i++)
des[i - 1] = *(src + i - des_len - 1);
}
int main() {
char str0[100] = "Hello";
Mystrcat(str0, ", World!");
std::cout << str0 << std::endl; //expecting "Hello, World!" to be printed
return 0;
}
我之前尝试过的是只写参数char* des
而不是char* &des
,但是和main
函数不同的是,在Mystrcat
函数中不能简单的用sizeof
就可以得到str0
数组的总大小,结果是:我认为使用指针引用会很好。我期待这是一个指针参数的引用,因为它等于语句char* &des = str0
。
1条答案
按热度按时间iqxoj9l91#
这里的问题是:
str
在本例中具有固定内存地址。它的地址是不可变的--可以这么说--因为它不是一个指向字符串的指针,而是可以在编译时计算的大小的字符数组(不是动态分配的)。让str
本身指向不同的地址是没有意义的,而且会引起一大堆混乱。即使修改动态分配数组的原始指针地址也是混乱的,因为你需要原始地址来正确地释放它。把T
的数组想象成T* const
(地址是不可变的,即使内容是可变的,即使动态分配,你也需要保持原始地址不变)。但总的来说,作为一个非盈利的广告,我想鼓励你尽可能多地接受值语义,而不是指针/引用语义。
您可以:
然后你可以传递一个地址给你的数组,得到一个指针指向一个新的修改过的副本(和你之前做的一样),并存储指向新数组的指针(当你完成的时候释放它)。如果你只是想分配一个新的字符串,那么修改现有的东西没有什么好处。
这仍然忽略了传统的建议,即您应该使用
std::string
,我认为您现在需要它,并全心全意地响应所有这些低级指针以及手动堆分配和释放(如果不使用RAII,当与抛出的异常结合使用时,这可能是灾难性的),但以后如果SBO太大或太小,或者如果SBO优化是反向的,您可能希望偏离它。例如,高效率,但这是深入到像自定义内存分配器之类的东西,以及一些通常保留到遇到分析器热点并真正知道自己在做什么的东西。