【问题标题】:Create Dynamically Allocated Array of Pointers C++创建动态分配的指针数组 C++
【发布时间】:2020-11-18 22:17:44
【问题描述】:

我目前正在尝试动态分配一个字符数组数组并将另一个字符数组数组中的值设置为新的动态数组。当我打印动态数组中的值时,我得到了一些垃圾值,我无法理解它们来自哪里。

类-

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▌]

我很想知道我做错了什么。

【问题讨论】:

  • edit 向我们展示minimal reproducible example 的问题。 Class 是什么? Class::getCoursesList() 做了什么并返回?
  • 一个提示:字符串 null-terminator 不计入 strlen 函数,也不包含在您的 strncpy 调用中.为其分配空间,并使用strcpy
  • @Someprogrammerdude 问题已更新
  • @SaiSreenivas 我明确调用构造函数“Class d1(courses,3);”
  • 另一个提示:除非您的作业或练习要求使用new[] 和以空字符结尾的字节字符串,否则请使用std::vectorstd::string。将使您作为 C++ 程序员的生活如此变得更加轻松。

标签: c++ arrays dynamic


【解决方案1】:

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

【讨论】:

  • 我尝试将 1 添加到 len 并添加 '\0' 并且仍然得到相同的垃圾值。 this->courses[i] = new char[strlen(courses[i]) + 1]; this->courses[strlen(courses[i])] = '\0';
  • @0xAlon 如果您使用strcpy 而不是strncpy,则不必显式添加终止符(但您仍必须为其分配内存)。
猜你喜欢
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
  • 2012-09-16
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
  • 1970-01-01
相关资源
最近更新 更多