Realloc()行为

时间:2014-10-11 19:41:45

标签: c malloc dynamic-memory-allocation realloc

我试图将通过argv []传递的多个参数连接到一个c-string中。我没有使用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));

with:

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

不会覆盖值13。

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

2 个答案:

答案 0 :(得分: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]);
    }
}

答案 1 :(得分:2)

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

你缺少argv [i]

的分配

你应该给出realloc

作为参数所需的总大小

在realloc中,您需要将大小设为 textLength + strlen(argv [i])+ 2