这可能已经被问过,但可能以不同的方式。 我搜索了很久但我找不到答案。我花了将近一整天的时间来解决这个小问题,所以我非常沮丧,不能再思考......
无论如何,我在访问动态结构时遇到问题。尝试了许多不同的方法但没有用。这是一个小例子: 假设我们有5个文件。一个main,调用function.cpp中的函数。 这是 function.cpp:
#include "struct.h"
#include <iostream>
void fc_a()
{
int a = 0;
std::cin >> a; //let's say 30
struct1* struct_test = new struct1[a];
struct_test[20].str = "Test";
std::cout << struct_test[20].str << std::endl;
}
void fc_b()
{
struct1 *struct_test; // just experimental, thought it would load the values
int b = 20; // dynamic as well, this is just for test
std::cout << struct_test[b].str << std::endl;
}
function.h具有main调用所需的东西 然后有我们的结构(例如 struct.h )
#ifndef STRUCT_H_INCLUDED
#define STRUCT_H_INCLUDED
#include <string>
struct struct1
{
std::string str;
int a;
int b;
};
#endif // STRUCT_H_INCLUDED
(随之而来的是 struct.cpp )
#include "struct.h"
extern struct1 struct_test; //also tried with pointer
(所以在这个例子中,我调用fc_a来动态地将结构扩展为cin大小(例如30),然后将字符串中第20个struct的内部放入“test”值。在fc_b中我试图访问第20个位置并输入值“test”。
问题是,这只是崩溃程序(如果输入是30,在较低的值它会做一些奇怪的东西),我不再有修复的想法。我只想从任何cpp文件访问此结构,将值保存在其中,并将它们用于以后的工作。最麻烦的事实是它是动态的,所以当我尝试以不同的方式修复它时,编译器大多数不接受任何没有[]或者只是抱怨“没有引用”错误等。 有什么想法吗?
答案 0 :(得分:1)
您已在struct1
中定义了您的类/结构struct.h
。然后,当您声明extern struct1 struct_test
时,告诉编译器您已将类型为sruct_test
的对象struct1
定义为其他位置的全局变量。
如果此对象未在某处定义为全局变量,则会出现链接器错误。
如果您已将此类对象定义为全局变量,则不会出现链接错误,一切正常。但是,在你的函数中,只要你写:
struct1* struct_test = new struct1[a];
您创建了一个名为struct_test
的本地对象,但它完全独立于其他地方定义的全局对象。它甚至有一个不同的类型(这里是一个指针)。函数返回后,该本地对象将被销毁,其内容将丢失。在这里,你会泄漏记忆。
如果你要将全局变量定义为指针,事情会变得更糟:
struct1* struct_test; // somewhere out of any function
此全局变量将自动初始化为nullptr
。现在,在您的函数中,您可能会产生初始化全局变量的印象,而实际上您正在使用本地变量。稍后在另一个函数中,您可以访问struct_test
的元素。由于全局变量仍然是nullptr,您将获得未定义的行为(例如:内存损坏,分段错误,冻结,各种奇怪的行为,甚至可能看起来正常)。
// function.cpp
#include "struct.h"
...
extern struct1* struct_test; // tell that it's defined somewhere else
void fc_a()
{
int a = 0;
std::cin >> a; //let's say 30
struct_test = new struct1[a]; // refer to the global variable without redefining it
if (a>20) {
struct_test[20].str = "Test";
std::cout << struct_test[20].str << std::endl;
}
else std::cout << "Ooops ! Just avoided a bad subscript !!" <<std::endl;
}
// other.cpp
#include <struct.h>
struct1* struct_test; // no extern: it's really defined here
当你学习时,第一个解决方案可以帮助你。在你养成坏习惯之前,应该避免这样做。
一种可能性是从指定函数的函数返回指针,然后将此指针作为参数传递给需要它的函数。
第二种可能性是使用vector<struct1>
更进一步。然后,您可以按值或按引用传递向量,但您可以避免必须关心内存分配。