动态分配字符数组的内存
dynamic allocating memory for char array
对下一个代码块有一些理解问题。
#include<iostream>
using namespace std;
int main() {
char *str = "hi";
char *p = new char[strlen(str) + 1];
for (int i = 0; *(str + i); i++)
*(p + i) = *(str + i);
cout << p << endl;
return 0;
}
结果如下:
hi═¤¤¤¤
当我使用调试器时,我可以看到我的p指向一个包含 10 或 15 个或其他一些符号的数组(取决于编译(,所以我在"hi"之后得到了额外的符号。但是,当我使用 strcpy(( 时:
#include<iostream>
using namespace std;
int main() {
char *str = "hi";
char *p = new char[strlen(str) + 1];
strcpy(p, str);
cout << p << endl;
return 0;
}
我得到的结果:
hi
那么,有人可以向我解释一下,为什么我用第一个程序示例得到这样的结果,以及如何重新设计它以获得像第二个示例一样的结果。 提前谢谢。
答案是在循环的停止条件下,即*(str + i)
:
for (int i = 0 ; *(str + i) ; i++)
*(p + i) = *(str + i);
请注意,表达式中没有比较运算符。当在需要逻辑条件的上下文中使用这样的表达式时,会隐式比较零,即*(str + i)
的意思与*(str + i) != 0
相同。
现在应该清楚为什么字符串保持未终止:循环在发现空终止符时停止,并且不会将其复制到目标字符串中。
做同样事情的一种稍微"神秘"的方式是将比较与作业相结合,就像K&R书所做的那样:
for (int i = 0 ; *(p + i) = *(str + i) ; i++)
;
现在,空测试在分配后进行,确保目标以空终止。
您没有将终止空字符添加到p
。
添加行
*(p + i) = ' ';
在for
循环之后。但是,为此,您必须在for
循环之前声明i
。
int i = 0;
for (i = 0; *(str + i); i++)
*(p + i) = *(str + i);
*(p + i) = ' ';
cout << p << endl;
你忘了在第一个 exend 中用零终止字符串:
#include <cstddef>
#include <iostream>
int main()
{
char const *str = "hi";
std::size_t length = std::strlen(str);
char *p = new char[length + 1];
for (std::size_t i = 0; i < length; ++i)
p[i] = str[i];
str[length] = ' ';
std::cout << p << 'n';
delete[] p;
}
请注意:字符串文字是不可变的,因此它们应该用char const*
s 指向。将对象大小保存在内存中或索引到其中的正确类型是std::size_t
,而不是int
。如果执行手动内存管理,则必须确保通过使用new
获得的指针传递到delete
以及将指针从new[]
传递到delete[]
来释放分配的内存。
不过,您不应该手动进行内存管理。使用像std::string
或std::vector
这样的容器,或者至少像std::shared_ptr<>
或std::unique_ptr<>
这样的智能指针。
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 使用无符号字符数组有效存储内存
- 在将数字随机生成为数组期间从内存输出随机数的数组
- 为什么调用堆栈数组会导致内存泄漏
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 在 C++ 中访问数组负索引处的内存不会返回垃圾
- 查找自动生成键并具有线性内存消耗的小型关联数组
- C++,为什么数组比矢量更快,使用更少的内存
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- 当另一个数组是内存集时,内存集是否会更改数组长度?
- 动态分配字符数组的内存
- 将内存分配返回值强制转换为 TYPE 数组
- 销毁C++中动态分配的内存(数组对象)
- 给定特定内存地址的数组的动态内存分配
- 如何通过 malloc 为队列数组分配内存?
- 如何使用内存集清除字符数组
- 如何初始化所有元素为 0 的指针的二维动态内存数组
- 共享内存数组是否由 CreateFileMapping/MapViewOfFile 零初始化
- C++ 分配 struc 的内存数组
- 在CUDA中有效初始化共享内存数组