C++从不同的cpp访问动态结构
C++ Accessing dynamic struct from different cpp
这可能已经被问过了,但可能是以不同的方式。我找了很久,但就是找不到答案。我花了将近一整天的时间试图解决这个小问题,所以我很沮丧,再也无法思考了。。。
无论如何,我在访问动态结构时遇到了问题。尝试了许多不同的方法,但都无济于事。下面是一个小例子:假设我们有5个文件。一个main,其中调用function.cpp中的函数。这里是函数.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;
}
函数.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),然后将"test"值放入字符串中结构的第20个索引中。在fc_b中,我试图访问第20个位置并定制值"test"。
问题是,这只是破坏了程序(如果imput是30,在较低的值上,它会做一些奇怪的事情),我再也没有修复的想法了。我只想从任何cpp文件访问这个结构,保存其中的值,并在以后的工作中使用它们。最麻烦的是它是动态的,所以当我试图用不同的方式修复它时,编译器大多不会接受没有[]的东西,或者只会抱怨"没有引用"错误等。有什么想法吗?
具有相同名称的全局变量和局部变量之间的差异
您已经在struct.h
中定义了类/结构struct1
。当您声明extern struct1 struct_test
时,您告诉编译器您已经在其他地方将类型为struct1
的对象sruct_test
定义为全局变量。
如果这个对象没有在某个地方定义为全局变量,则会出现链接器错误。
如果您已经将这样一个对象定义为全局变量,那么就不会出现链接错误,而且一切都很好。然而,在您的函数中,每当您写入:
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
避免全局变量&进一步的步骤
当你开始学习时,第一个解决方案会有所帮助。在你养成坏习惯之前,应该避免它。
一种可能性是,从分配指针的函数返回指针,然后将此指针作为参数传递给需要它的函数
第二种可能性是进一步使用CCD_ 9。然后可以通过值或引用传递向量,但不必关心内存分配。
- 访问动态分配列表中的元素
- C++ 中动态二维数组的访问冲突
- 0xC0000005:访问冲突写入位置0xCDCDCDCD动态分配错误
- 是否可以使用宏来访问动态数组或向量中的元素或为其赋值
- 如何修复访问动态数组中结构中的字符串变量时"segmentation fault (core dumped)"错误
- C++ 如何使用类方法正确访问动态数组元素
- 访问动态 2D 字符数组时引发访问冲突异常
- 虚幻引擎:访问动态产卵的蓝图实例数据
- 尝试使用成员函数访问动态分配的成员变量时读取访问冲突
- 如何在c++中访问动态分配的矩阵
- Qt:我什么时候可以从qtcreator访问动态属性
- 访问动态创建的对象 c++
- 引用变量可以访问动态分配的内存
- 如何从传递给c++中的函数的对象访问动态2D数组
- C++从不同的cpp访问动态结构
- 访问动态2D字符数组C++
- 如何访问动态对象属性
- c++为什么不使用星号操作符访问动态数组
- 如何访问动态c++数组变量,属于一个对象,与Python
- c++:随机访问动态数组