我在某人的代码中遇到了这个问题……我不知道它是否正确(因为即使看起来不正确,它也可以工作)。有人可以澄清这是否正确,为什么如此以及为什么仍然有效吗?
简而言之,我们希望将所有串联的参数(作为命令行)存储在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字节)。但是,当您运行它并将其参数复制到它时,它可以工作,有人也可以解释吗?
答案 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);
. . .
}