灵活数组成员的使用无效
Invalid use of flexible array member
我在编程时遇到了一个问题。
struct skills {
int SnCrypt;
char* Soutput;
int Soptind;
int Sdecrypt;
int Sargc;
char* Spassword;
char *const Sargv[];
};
struct skills* initSkills(int nCrypt, char* password, char *const argv[], char* output, int optind, int decrypt, int argc) {
struct skills* skill;
skill->SnCrypt = nCrypt;
skill->Spassword = password;
skill->Sargv = argv;
skill->Soutput = output;
skill->Soptind = optind;
skill->Sdecrypt = decrypt;
skill->Sargc = argc;
return skill;
}
gcc告诉我
使用灵活数组成员无效
用于行skill->Sargv = argv;
。
我不明白我怎么能把char *const argv[]
指向的值指向另一个指针?我知道我肯定要malloc
和skill->Sargv
指针,但怎么做呢?像这个(char const*)malloc(sizeof(argv[]))
?
下面的答案是C,在这个问题的上下文中,它似乎比C++更合适。
基本上不应该声明一个条目数未知的数组(也称为"灵活数组")。唯一的方法是将其声明为结构中的最后一个字段。
这在某种程度上表明整个结构的大小是未知的。
因此,您不能静态实例化这个结构:
struct skills x; // will generate a compilation error
相反,您只能动态地实例化它。例如,这里有一个这种结构的例子,其Sargv
阵列足够大,可以容纳5个元素:
struct skills* x = malloc(sizeof(struct skills)+5*sizeof(char*));
说了这么多,有两个选项可供您修复代码:
选项#1-假设您使用函数main
的argv
调用函数initSkills
(该函数在程序的整个生命周期中都驻留在内存中),您不妨声明:
struct skills
{
...
char** const Sargv; // instead of 'char* const Sargv[]'
};
选项#2-分配struct skills
实例的Sargv
数组足够大,可以容纳argc
元素,然后将每个元素从argv
数组复制到Sargv
数组:
int i;
struct skills* skill = malloc(sizeof(struct skills)+argc*sizeof(char*));
...
for (i=0; i<argc; i++)
{
skill->Sargv[i] = malloc(strlen(argv[i])+1);
strcpy(skill->Sargv[i],argv[i]);
}
return skill;
请注意,您的代码中还有一个额外的(无关的)修复程序要应用:
更改此项:
skill->Spassword = password;
对此:
skill->Spassword = malloc(strlen(password)+1);
strcpy(skill->Spassword,password);
相关文章:
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 使用 std::index_sequence 初始化具有固定大小数组成员的 POD 结构容器
- 为什么静态数组成员变量在调用对象的实例后不显示任何内容?
- 将C++浮点数组成员直接封送到 C#,而无需复制
- 用于对项目进行分组并将单个项目映射到其他组成员的数据结构
- C++ - 移动具有固定大小的 c 样式数组成员的类的构造函数
- C++内联数组成员统一初始化
- 有没有办法把字符串数组成员放在".structurevariable"前面?
- C++ 在具有数组成员的类上无效指针/双精度释放
- 将初始化列表传递给 C++ 中的数组成员
- 具有灵活数组成员的结构的大小
- 初始化固定的 C 数组成员结构
- 带有布尔数组成员的 C++ 结构.如何在主代码中使用
- 在静态成员函数中无效使用成员“xx::x”
- 将元组成员包装在其他模板化类型中
- 我如何通过构造函数大小私人std ::数组成员
- 通过两个下标访问数组成员
- size_t结构非数组成员崩溃的强制转换
- 标准::元组成员逐个成员比较失败
- 灵活数组成员的使用无效