C++ 枚举指针能否指向常量值?

C++ 枚举指针能否指向常量值?,c++,pointers,enums,segmentation-fault,C++,Pointers,Enums,Segmentation Fault,我正在编写一些代码,其中定义了一个“枚举”来描述错误的类型。 每当调用某个函数时,它都将“枚举指针”作为参数。然后,该函数将使用“常量枚举”值设置传入的错误变量。当我运行程序时,我得到一个运行时错误。我提供了一些代码来描述我的问题: enum error { No_Exist=0, No_Error, Unknown, }; bool process_something(..., error *err) { .... .... ....

我正在编写一些代码,其中定义了一个“枚举”来描述错误的类型。 每当调用某个函数时,它都将“枚举指针”作为参数。然后,该函数将使用“常量枚举”值设置传入的错误变量。当我运行程序时,我得到一个运行时错误。我提供了一些代码来描述我的问题:

enum error
{
    No_Exist=0, 
    No_Error,
    Unknown,
};

bool process_something(..., error *err)
{
    ....
    ....
    ....
    *err = No_Error;
    return 1;
}

int main()
{
    error *err_val; 
    if(process_something(...,err_val))
    {
    .....
    .....
    }
    .....
    return (0);
}

我想知道是否可以为指针枚举变量赋值为“No_Error”?

现在,如果必须使用正在使用的内容,则应通过引用来完成

比如说,

int readnumber(string userinput, bool* ok);// or your enum instead of a boolean
//
bool okay;
auto val = readstring(someinput,&okay);
if (!okay)
{
    cout << "Something weird but we don't want that to crash our program";
}
int readnumber(字符串userinput,bool*ok);//或者使用枚举而不是布尔值
//
布尔好;
auto val=readstring(someinput,&ok);
如果(!好的)
{

cout当您看到以下函数时:

void foo(int*);
这并不意味着您需要传递显式声明的
int*
变量。以下是错误用法:

int* p;
foo(p);
以下是正确的,但不正确:

int* p;
int a;
p=&a;
foo(p); // p points to a
以下也是正确的(但同样不正确,IMO):

最正确的用法(根据手头的问题)是:

int a;
foo(&a);
请记住,
int*
(或任何
T*
)表示向我传递地址,而不是向我传递指针。另一个例子是引用。如果函数类似于:

void bar(int&);
并不意味着您必须声明一个int引用并传递它:

int a;
int &r = a;
bar(r);
而是传递
a
本身。函数需要一个引用(L值)。

这:

int main()
{
    error *err_val; 
    if(process_something(...,err_val))
应该是:

int main()
{
    error err_val; 
    if(process_something(..., &err_val))

你需要传递一个有效的
错误的地址
来创建一个指向某个地方的指针
process\u something()
可以实际写入。你的代码会触发未定义的行为。

你首先需要初始化指向某个地方的指针,
error*err\u val;
指向任何地方。更好的是,把它用作一个值(
error err\u val;
)或者,换句话说,行
*err=No_Error;
可以很好,只是您调用函数的方式是错误的。@n您的意思是,如果我将简单变量作为'Error err',调用函数时将地址作为'&err'传递,则不会有任何分段错误。正确。否则请更改签名重新调用
process\u something(…,error&err)
并将其命名为
if(process\u something(…,err))
(使用
error err=Unknown;
)这对我很有帮助。我明白了。这些“错误”不是“异常”,它们只是用于日志记录目的。枚举是我们在进程之后设置的已定义错误('function'))这是一个解决问题的代码。当你说“不正确的”是指“坏的风格”。在C++中,“不成形”是指“不好形成”(从C++ 11标准引用)是指“根据语法规则、可诊断语义规则和一个定义规则构造的C++程序”。从这个意义上讲,我更喜欢C++,因为它是C++标准给出的一个例子,你给出的例子并不是不正确的。
int main()
{
    error err_val; 
    if(process_something(..., &err_val))