【发布时间】:2020-04-21 01:16:36
【问题描述】:
当我尝试运行以下代码时,我没有收到任何错误或警告,但我的终端总是崩溃。为什么会这样,我该如何解决?
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;
}
colors.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
colors.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;
}
【问题讨论】:
-
在
getRGB中返回一个指向局部变量的指针,该变量在函数返回时被销毁 -
@M.M 哦,我明白了,arr[] 不在范围内。但如果不是错误,我的编译器至少不会发出警告吗?
-
语言标准不需要针对这种情况发出警告,由各个编译器发出警告。有些人会。 Example
-
@MM 我明白了;我将 CodeBlocks 与 GCC 一起使用。为什么标准没有为此提供一些东西,因为我想不出一个可行的实例?
-
GCC 也会发出此警告,因此请考虑更改警告标志或升级编译器版本(默认情况下,代码块带有糟糕的 gcc 构建)。即使早在 gcc 4.1,我也看到没有额外标志的警告,也许有警告但你没有找对地方?
标签: c++ arrays char cout dereference