为什么我无法计算出取消引用的 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,所以没必要动态分配。这样做消除了编译器进行静态分析和优化代码的可能性。
当我尝试 运行 以下代码时,我没有收到任何错误或警告,但我的终端总是崩溃。为什么会这样,我该如何解决?
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,所以没必要动态分配。这样做消除了编译器进行静态分析和优化代码的可能性。