调整数组大小,从C中的书中编写代码

时间:2018-02-14 17:29:38

标签: c

我目前正试图理解本书中的指示,
http://shop.oreilly.com/product/0636920028000.do

指针和数组一章中,在此标题下使用realloc函数调整数组大小 第87页作者已提供了一个代码段如果我们不知道要输入多少个字符,请调整数组大小。

    /*read in characters
    from standard input and assign them to a buffer. The buffer will contain all of the
    characters read in except for a terminating return character
    */
    #include <stdio.h>
    #include <stdlib.h>

    char* getLine(void) 
    {
        const size_t sizeIncrement = 10;
        char* buffer = malloc(sizeIncrement);
        char* currentPosition = buffer;
        size_t maximumLength = sizeIncrement;
        size_t length = 0;
        int character;

        if(currentPosition == NULL) 
            { 
                return NULL; 
            }

        while(1) 
            {
                character = fgetc(stdin);
                if(character == '\n') 
                    { 
                        break; 
                    }

                if(++length >= maximumLength) 
                    {
                        char *newBuffer = realloc(buffer, maximumLength += sizeIncrement);
                        if(newBuffer == NULL) 
                            {
                                free(buffer);
                                return NULL;
                            }
                        currentPosition = newBuffer + (currentPosition - buffer);//what is the purpose of this??
                        buffer = newBuffer;
                    } 
                *currentPosition++ = character;
        }//while

        *currentPosition = '\0';
        return buffer;
    }

    int main(void)
    {
        char *s = getLine();
        printf("%s\n", s);
        return 0;
    }

我评论了这部分代码

currentPosition = newBuffer + (currentPosition - buffer);

并运行代码。它仍然奏效。 我不确定,这行代码的用途是什么,因为对newBuffer的评估和缓冲区总是相互抵消。

我的理解是否缺少某些东西?

如果不是,我应该虔诚地遵循这本书吗?

1 个答案:

答案 0 :(得分:2)

currentPosition = newBuffer + (currentPosition - buffer);

所以(currentPosition - buffer)是偏移量(位置 - 起始=偏移量)

在重新分配之后,旧指针可能或可能不好,它是UB ...所以你总是需要使用新返回的指针......但是内容被复制了。所以它就像一个新的更大的缓冲区,你需要将当前位置更新为新缓冲区中的相同偏移...所以

currentPosition = newBuffer + (currentPosition - buffer);

非常有意义......