为什么我无法计算出取消引用的 char 指针?

Why am I unable to cout a dereferenced char pointer?

当我尝试 运行 以下代码时,我没有收到任何错误或警告,但我的终端总是崩溃。为什么会这样,我该如何解决?

main.cpp

#include <iostream>
#include <cstdio>
#include "colours.hpp"

using namespace std;

int main()
{
    colour co(50,65,78);
    unsigned char *cp = co.getRGB();
    cout << *cp << endl;
    getchar();
    return 0;
}

colours.hpp

#ifndef COLOURS
#define COLOURS

class colour{
    public:
        colour(unsigned char r, unsigned char g, unsigned char b);
        unsigned char *getRGB();
    private:
        unsigned char red, green, blue;
};

#endif // COLOURS

colours.cpp

#include "colours.hpp"

colour::colour(unsigned char r, unsigned char g, unsigned char b) : red(r), green(g), blue(b) {
}

unsigned char *colour::getRGB(){
    unsigned char arr[3] = {red, green, blue};
    return arr;
}

您已经在以下函数的堆栈上本地定义了一个数组:

unsigned char *colour::getRGB(){
    unsigned char arr[3] = {red, green, blue};
    return arr;
}

当函数returns时,堆栈递减,数组不再有效(指向数组的指针也是如此)。这就是当您取消引用指针时您的程序崩溃的原因。

要解决此问题,您可以使用颜色数组,因为您在编译时知道大小。

std::array<unsigned char, 3> colour::getRGB(){
    std::array<unsigned char, 3> color = {red, green, blue};
    return color;
}

另一种方法是在堆上分配,而不是在堆栈上分配,

unsigned char* colour::getRGB() {
    int size = sizeof(unsigned char) * 3;  // Get the size of 3 unsigned chars.
    unsigned char* color = (unsigned char*) malloc(size);
    color[0] = red;
    color[1] = green;
    color[2] = blue;

    return color;
}

这种方法有一些缺点。首先,您必须记得在完成分配后释放您分配的内存。

colour a = colour(255, 0, 255);
unsigned char* rgb = a.getRGB();
// ---- DO STUFF ---
free(rgb);

其次,速度慢。以这种方式动态分配内存需要向操作系统请求更多内存,这需要一些时间。

第三,因为我们已经知道我们要有3个unsigned chars,所以没必要动态分配。这样做消除了编译器进行静态分析和优化代码的可能性。