灵活数组成员的使用无效

Invalid use of flexible array member

本文关键字:无效 组成员 数组      更新时间:2023-10-16

我在编程时遇到了一个问题。

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[]指向的值指向另一个指针?我知道我肯定要mallocskill->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-假设您使用函数mainargv调用函数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);