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