This question already has answers here:
Are flexible array members valid in C++?

(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-假设您要使用函数initSkillsargv调用函数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