这是分配内存的正确方法吗?

时间:2018-09-06 05:14:47

标签: c string malloc command-line-arguments allocation

我在某人的代码中遇到了这个问题……我不知道它是否正确(因为即使看起来不正确,它也可以工作)。有人可以澄清这是否正确,为什么如此以及为什么仍然有效吗?


简而言之,我们希望将所有串联的参数(作为命令行)存储在1个字符串中。

注意:每个字符串至少包含1个字符。


代码段:

int main(int argc, char **argv) {

    // Declaring a pointer to a string
    char *desintation_string;

    // Allocating enough memory to store all arguments (given as command-line) concatenated 
    destination_string = malloc((argc) * sizeof(char));   /* <————— is this correct ? does 
                                                                    it indeed allocate
                                                                    enough memory to fit
                                                                    all the arguments
                                                                    concatenated ? */
    . . . 
}

问题是:

此行“ destination_string = malloc((argc) * sizeof(char));”是否分配了足够的内存来这样做?

有人可以确切解释这是什么吗?因为我读为:它正在分配(argc * 1字节)。但是,当您运行它并将其参数复制到它时,它可以工作,有人也可以解释吗?

3 个答案:

答案 0 :(得分:4)

不。假设您的论据是"foo" "bar"。这就是argc = 2。在这种情况下,使用malloc((argc) * sizeof(char))仅分配2个字符的内存。

argv是2D数组(因此为argv**)。您需要检查每个参数拳头的长度,以便为它们分配内存。


malloc((argc) * sizeof(char))的作用: argc是您传递的参数数量。 sizeof(char)返回需要为char变量分配的字节数。这样您得到malloc(<number of bytes needed to store argc number of char variables>)malloc()在堆中分配该字节数。

答案 1 :(得分:0)

  

此行是否为“ destination_string = malloc((argc)* sizeof(char));”?   分配足够的内存来做到这一点?

。您需要分配足够的内存。例如这里

Mi = ['CollgCr', 'Veenker']
Lo = ["Mitchel", "OldTown", "BrkSide", "Sawyer", "NAmes", "IDOTRR",
      "MeadowV", "Edwards", "NPkVill", "BrDale", "SWISU", "Blueste"]

d = {**dict.fromkeys(Lo, 'Lower'), **dict.fromkeys(Mi, 'Middle')}

例如命令行:df_full['new'] = df_full['city'].map(d).fillna('Upper') print (df_full) city new 0 CollgCr Middle 1 Veenker Middle 2 CollgCr Middle 3 Crawfor Upper 4 NoRidge Upper 5 Mitchel Lower 6 Somerst Upper 7 NWAmes Upper 8 OldTown Lower 9 BrkSide Lower

map

答案 2 :(得分:0)

您的代码仅适用于简短的参数类型(即-x)。但是对于长类型的参数(即--list),它将失败。

这是您的操作方式。

int main(int argc, char **argv) {

    // Declaring a pointer to a string.
    char *desintation_string;
    int Arg_Size = 0;

    // Allocating enough memory to store all arguments concatenated.
    // argv[0] is path not argument given in command line
    for (int i=1, i <= argc, i++)
        Arg_Size += sizeof(argv[i]);

    destination_string = malloc(Arg_Size); 
    . . . 
}