首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Realloc()行为

Realloc()行为
EN

Stack Overflow用户
提问于 2014-10-11 19:41:44
回答 2查看 182关注 0票数 1

我试图将通过argv[]传递到c-字符串中的多个参数连接起来。我不使用char数组,因为我不希望对通过argv[]传递的字符数量有任何限制。

这是我如何执行程序的一个例子。

可执行-cmd rotn 13 Hello

代码语言:javascript
复制
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”当我第一次遍历for循环时,externalCommand是"rotn 13",这是正常的。

当我第二次遍历循环时,当我运行realloc()时,我会得到奇怪的行为。externalCommand变成了"rotn _G_~_\“。我知道这些是垃圾值,但我不明白为什么realloc()覆盖字符串中的数字"13“。

为了解决这个问题,我可以取代:

代码语言:javascript
复制
externalCommand = (char *)realloc(externalCommand, sizeof(char) * (textLength + 1));

有:

代码语言:javascript
复制
externalCommand = (char *)realloc(externalCommand, sizeof(char) * (textLength + 3));

它不会覆盖值13。

我想了解为什么在重新分配时我需要将3添加到textLength中。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-11 19:51:15

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

代码语言:javascript
复制
externalCommand = (char *)realloc(externalCommand, sizeof(char) * (textLength + 1 + strlen(argv[i]) + 1));

也就是说,如果预先计算缓冲区大小,则可以去掉realloc()并使用单个malloc()

代码语言:javascript
复制
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]);
    }
}
票数 3
EN

Stack Overflow用户

发布于 2014-10-11 19:51:08

realloc()将ptr指向的内存块的大小更改为作为输入传递的字节大小。

您缺少argvi的分配。

您应该将所需的总大小作为realloc的参数。

在realloc中,您需要给出大小为textLength + strlen(argvi) + 2

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26318564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档