我目前正试图理解本书中的指示,
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的评估和缓冲区总是相互抵消。
我的理解是否缺少某些东西?
如果不是,我应该虔诚地遵循这本书吗?
答案 0 :(得分:2)
currentPosition = newBuffer + (currentPosition - buffer);
所以(currentPosition - buffer)
是偏移量(位置 - 起始=偏移量)
在重新分配之后,旧指针可能或可能不好,它是UB ...所以你总是需要使用新返回的指针......但是内容被复制了。所以它就像一个新的更大的缓冲区,你需要将当前位置更新为新缓冲区中的相同偏移...所以
currentPosition = newBuffer + (currentPosition - buffer);
非常有意义......