This question already has answers here:
Are flexible array members valid in C++?
(8个答案)
6年前关闭。
我在编程时遇到问题。
和海湾合作委员会告诉我
用于
我不明白如何用其他指针指向
选项#2-分配
请注意,您还需要在代码中应用其他(无关)修复程序:
更改此:
对此:
(8个答案)
6年前关闭。
我在编程时遇到问题。
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;
}
和海湾合作委员会告诉我
用于
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-假设您要使用函数initSkills
的argv
调用函数main
(它在程序的整个生命周期中都驻留在内存中),您最好声明以下内容:
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);
07-28 01:33