首页 > 解决方案 > 创建动态分配的指针数组 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▌]

我很想了解我做错了什么。

标签: c++arraysdynamic

解决方案


看这里,你可能从文档中了解到,strlen 函数不计算\0字符串结尾的字符。因此它不会被 strcpy 函数调用复制,并且 cout 不会遇到\0. 这就是终端输出中出现荒谬字符的原因。在为课程名称分配内存时,再分配一个 char 并添加\0char 数组的末尾。


推荐阅读