使用void函数初始化标头中的结构数组 我只是学习C++。我想知道这样初始化数组是否合法?我的目标是避免cpp中出现非常长的数组列表。 如果不是,我该怎么做才能合法?VisualStudio不会对错误加下划线,但应用程序在开始时失败并崩溃

使用void函数初始化标头中的结构数组 我只是学习C++。我想知道这样初始化数组是否合法?我的目标是避免cpp中出现非常长的数组列表。 如果不是,我该怎么做才能合法?VisualStudio不会对错误加下划线,但应用程序在开始时失败并崩溃,c++,arrays,header-files,C++,Arrays,Header Files,在标题中。h: #ifndef _INC_HEADER_H #define _INC_HEADER_H struct symname{ char* DP; }; struct symname getSymName[4]; void init_allArrays(){ getSymName[0].DP = "name0"; getSymName[1].DP = "name1"; getSymName[2].DP = "name2";

在标题中。h:

#ifndef _INC_HEADER_H
#define _INC_HEADER_H

struct symname{ char* DP; };

struct symname getSymName[4];

void init_allArrays(){
        getSymName[0].DP = "name0";
        getSymName[1].DP = "name1"; 
        getSymName[2].DP = "name2"; 
        getSymName[3].DP = "name3"; 
}

#endif // _INC_HEADER_H
#include "header.h" 

init_allArrays() ; 

char * test = getSymName[0].DP  // can i acceed to the array at this point ?!
现在在我的main.cpp:

#ifndef _INC_HEADER_H
#define _INC_HEADER_H

struct symname{ char* DP; };

struct symname getSymName[4];

void init_allArrays(){
        getSymName[0].DP = "name0";
        getSymName[1].DP = "name1"; 
        getSymName[2].DP = "name2"; 
        getSymName[3].DP = "name3"; 
}

#endif // _INC_HEADER_H
#include "header.h" 

init_allArrays() ; 

char * test = getSymName[0].DP  // can i acceed to the array at this point ?!

您不希望将字符串文字(“这是字符串文字”)分配给字符指针。修改该字符串文字是未定义的行为,将导致程序崩溃

如前所述,通常您希望使用std::string,并尽可能避免使用全局变量

此外,它看起来像是在main()这样的函数之外运行的,因此您应该阅读isocpp.org/wiki/faq/ctors#static init order


这篇文章的意思是,在运行时不能保证全局/静态的初始化顺序,所以如果在
init_allarray()之前运行
char*test=getSymName[0].DP
,该怎么办?这将很糟糕,但也可能只发生50%的时间,导致不可预测的崩溃。

使用标准集合,不要使用全局集合。然后你所有的问题都会消失,我想。你没有在任何地方声明结构,所以你不能填充数组。你试过了吗?它起作用了吗?请阅读“静态初始化失败”一文,以获得更彻底的答案,解释为什么您尝试这样做的方式不是一个好方法。编辑:这假设您正在运行的代码在main.cpp中,但在main()之外@Evan Carslake我在header中声明了结构,因为我在main中包含了它,所以我应该在main中重新声明结构吗?为什么两次?@guillaumeimportexport通常让编译器处理代码,它会告诉你语法是否正确。另外,您实际上在哪里为
DP
分配内存呢?那么如果char*test=getSymName[0].DP在init_allarray()之前运行呢;?我明白了,我该如何避免这种情况?@guillaumeimportexport这是下一节:@guillaumeimportexport同样,我会确保你使用的是字符串而不是char*,你必须知道一些关于内存分配/释放的知识才能使用char*,除非你真的需要它们,否则这是不值得的。