灵活数组成员的使用无效

时间:2014-03-04 17:43:31

标签: c++

我在编程时遇到了问题。

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[]))

1 个答案:

答案 0 :(得分:2)

以下答案在C中,在这个问题的上下文中似乎比C ++更合适。

您基本上不应该声明具有未知数量的条目的数组(AKA“灵活数组”)。唯一的方法 - 完全按照你的方式 - 将结构声明为最后一个字段

它表明整个结构的大小是未知的。

就这样,你不能静态地实例化这个结构:

struct skills x; // will generate a compilation error

相反,您只能动态实例化它。例如,以下是此结构的一个实例,其Sargv数组足以容纳5个元素:

struct skills* x = malloc(sizeof(struct skills)+5*sizeof(char*));

说了这么多,您可以通过两种方式修复代码:

选项#1 - 假设您正在使用函数initSkills的{​​{1}}调用函数argv(在程序的整个生命周期内都驻留在内存中),您可能也是如此声明:

main

选项#2 - 分配struct skills { ... char** const Sargv; // instead of 'char* const Sargv[]' }; 个实例及其struct skills数组足够大以容纳Sargv个元素,然后将argc数组中的每个元素复制到{ {1}}数组:

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;