gpt4 book ai didi

c - Realloc() 行为

转载 作者:太空宇宙 更新时间:2023-11-04 01:04:44 25 4
gpt4 key购买 nike

我正在尝试将通过 argv[] 传递的多个参数连接成一个 C 字符串。我没有使用 char 数组,因为我不想对通过 argv[] 传递的字符数量有任何限制。

这是我将如何执行程序的示例。

executable -cmd rotn 13 Hello World

char *externalCommand = NULL;
if (argc >= 3 && strcmp(argv[1], "-cmd") == 0)
{
externalCommand = (char *)malloc(sizeof(char) * (strlen(argv[2]) + 1));
strcpy(externalCommand, argv[2]);
for (int i = 3; i < argc; ++i)
{
int textLength = strlen(externalCommand);
externalCommand = (char *)realloc(externalCommand, sizeof(char) * (textLength + 1));
strcpy(externalCommand + textLength, " ");
strcpy(externalCommand + textLength + 1, argv[i]);
}
}

我的目标是以字符串“externalCommand”结尾,使其相等:“rotn 13 Hello World”当我第一次通过 for 循环时,externalCommand 是“rotn 13”,这是正常的。

当我第二次执行循环时,运行 realloc() 时出现奇怪的行为。 externalCommand 变为“rotn ÍÍÍýýýý««««««««îþîþ”。我知道这些是垃圾值,但我不明白为什么 realloc() 会覆盖我的字符串中的数字“13”。

要解决这个问题,我可以替换:

externalCommand = (char *)realloc(externalCommand, sizeof(char) * (textLength + 1));

与:

externalCommand = (char *)realloc(externalCommand, sizeof(char) * (textLength + 3));

它不会覆盖值 13。

我想明白为什么在重新分配时需要将 textLength 加 3。

最佳答案

您的 realloc() 没有分配足够的内存来保存您正在复制到缓冲区中的数据。改用这个:

externalCommand = (char *)realloc(externalCommand, sizeof(char) * (textLength + 1 + strlen(argv[i]) + 1));

话虽如此,如果您预先计算缓冲区大小,则可以摆脱 realloc() 并使用单个 malloc():

char *externalCommand = NULL;
if (argc >= 3 && strcmp(argv[1], "-cmd") == 0)
{
int textlength = strlen(argv[2]);
for (int i = 3; i < argc; ++i)
textLength += (1 + strlen(argv[i]));

externalCommand = (char *)malloc(sizeof(char) * (textLength + 1));

strcpy(externalCommand, argv[2]);
for (int i = 3; i < argc; ++i)
{
strcat(externalCommand, " ");
strcat(externalCommand, argv[i]);
}
}

关于c - Realloc() 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26318564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com