Enum指针可以指向常量值吗?

时间:2014-10-16 07:09:01

标签: c++ pointers enums segmentation-fault

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

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'指定指针枚举变量?

3 个答案:

答案 0 :(得分:2)

当你看到像以下这样的函数时:

void foo(int*);

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

int* p;
foo(p);

以下是正确的,但不正确:

int* p;
int a;
p=&a;
foo(p); // p points to a

以下也是正确的(但同样不合适,IMO):

 int* p;
 p = new int;
 foo(p); // p points to allocated memory

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

int a;
foo(&a);

请记住,int*(或任何T*)表示传递给我一个地址,并且不会说给我一个指针。另一个例子是参考。如果函数如下:

void bar(int&);

并不意味着你必须声明一个int-reference,并传递它:

int a;
int &r = a;
bar(r);

而是传递a本身。函数需要引用(L值)。

答案 1 :(得分:0)

此:

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

应该是:

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

您需要传递有效error的地址,以创建指向process_something()实际可写的某个地方的指针。您的代码会触发未定义的行为。

答案 2 :(得分:-1)

现在,如果你必须使用你正在使用的东西,你应该参考。

例如,

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";
}