结构创建问题

时间:2015-12-09 17:40:19

标签: c++

我有一个像这样声明的结构:

struct sExample {
  int something;
  char somethingElse[32];
  bool another;
  // many other fields
};

它有intchar[]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。 任何人都可以解释这里的问题是什么?

1 个答案:

答案 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;
}