我在编程时遇到了问题。
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[]))
?
答案 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;