我有一个像这样声明的结构:
struct sExample {
int something;
char somethingElse[32];
bool another;
// many other fields
};
它有int
,char[]
和bool
。现在让我们面对这个问题。首先,我创建了一个使用sExample
类型的临时变量的类。
class ExClass {
void fun() {
sExample myStruct;
// Initialize some of the struct fields (just some of them!)
strcpy(myStruct.somethingElse, "TEXT");
// Use struct in function that may read or modify it
globalFunction(&myStruct);
}
}
它工作得很好,但后来我决定myStruct
应该可用的时间更长,然后只是功能乐趣,所以我把它移到了班级成员:
class ExClass {
sExample myStruct;
void fun() {
// Same code as above
// Initialize some of the struct fields (just some of them!)
strcpy(myStruct.somethingElse, "TEXT");
// Use struct in function that may read or modify it
globalFunction(&myStruct);
}
}
这就是问题所在。调用globalFunction
会导致段错(这是来自外部第三方库的函数,因此我无法确定问题的确切位置)。
我也尝试使用= {0}
初始化struct,但它没有帮助。有什么不对?
我使用的是Gcc 4.9,C ++ 11。
任何人都可以解释这里的问题是什么?
答案 0 :(得分:2)
如果这是您唯一的更改,那么您的问题是您在fun()
的无效实例上调用了ExClass
。或者你忘记了新课程,或者它已被删除/超出范围。
F.e。这个Ideone示例非常有效,因为A a
是在fun()
内的堆栈上创建的。但是,一旦将a
的声明移到类级别,就会出现异常,因为*b
未实例化。
#include <iostream>
using namespace std;
struct A {
int data;
A() : data(123) { }
};
class B {
public:
void fun() {
A a;
cout << a.data;
}
};
int main() {
B* b; // b points to random memory, thus is an invalid instance
b->fun(); // this still works because fun doesn't access any member of B
return 0;
}