c++ - 创建动态分配的指针数组 C++
问题描述
我目前正在尝试动态分配一个字符数组数组并将另一个字符数组数组中的值设置为新的动态数组。当我从动态数组中打印值时,我得到了一些垃圾值,我无法理解它们来自哪里。
班级 -
class Class {
private:
char** courses;
int numberOfCourses;
public:
Class();
Class(const char** courses, int numberOfCourses);
~Class();
char** getCoursesList();
int getNumberOfCourses();
};
构造函数(分配内存) -
Class:: Class(const char **courses, int numberOfCourses) {
if (numberOfCourses <= 0){
this->numberOfCourses = 0;
this->courses = nullptr;
} else{
this->numberOfCourses = numberOfCourses;
this->courses = new char*[numberOfCourses];
for (int i = 0; i < numberOfCourses; i++) {
cout << strlen(courses[i]) << endl; // 5
this->courses[i] = new char[strlen(courses[i])];
cout << strlen(this->courses[i]) << endl; // 22
strncpy(this->courses[i], courses[i], strlen(courses[i]));
}
}
}
getNumberOfCourses -
int Class::getNumberOfCourses() {
return this->numberOfCourses;
}
获取课程列表 -
char **Class::getCoursesList() {
return this->courses;
}
主要的 -
const char *courses[] = {"test1", "test2", "test3" };
Class d1(courses,3);
for (int i = 0; i < d1.getNumberOfCourses(); i++) {
cout << d1.getCoursesList()[i] << endl;
}
输出 -
[test1═²²²²▌▌▌▌▌▌l┴╓K▌] [test2═²²²²▌▌▌▌▌▌@┴2K▌] [test3═²²²²▌▌▌▌▌▌Y┴;K▌]
我很想了解我做错了什么。
解决方案
看这里,你可能从文档中了解到,strlen 函数不计算\0
字符串结尾的字符。因此它不会被 strcpy 函数调用复制,并且 cout 不会遇到\0
. 这就是终端输出中出现荒谬字符的原因。在为课程名称分配内存时,再分配一个 char 并添加\0
char 数组的末尾。
推荐阅读
- amazon-web-services - EKS - 来自多个 VPC/账户的工作节点
- php - 是否有理由不将我的管理目录放在 robots.txt 中?
- c# - 具有特殊值条件的分组导致Linq c#
- python - 为什么在这种情况下我需要调用“自我”?
- html - 如何使用javascript在单击按钮/图标时弹出一个窗口
- reactjs - 如何在onClick上连续获取值
- mysql - MySQL FORIEGN_KEY_CHECKS=1 默认情况下,但不工作
- deep-learning - 脉冲神经网络的文本输入
- orgchart - 如何通过从mysql和php获取数据来制作组织结构图
- bazel - 使用 bazel 生成 par 文件时无法为 //:abc/requirements.txt 加载包